2014-03-06 71 views
7

我試圖用git replace改寫歷史並更換樹 的犯了一個不同的樹對象提交。我想使這個 永久。如何使用git替換替換的樹提交

documentation for git replace似乎表明這是 可能。我改編了以下配方來取代How to prepend the past to a git repository?的提交。

# setup a second branch with a different tree 
# existing repo which already contains a few commits 
git checkout master -b master2 
echo "test file" > testfile.txt  # a different tree 
git add testfile.txt 
git commit -m "test" 

# save the SHA1 of the original tree for later reference 
ORIG=$(git rev-parse master^{tree}) 

# replace the tree of master with the one from master2 
git replace master^{tree} master2^{tree} 

# verify the contents of the replaced tree 
git ls-tree master 

這個作品,大師的樹已經被從master2的一個替代,包括 額外的文件:

100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad readme.txt 
100644 blob 16b14f5da9e2fcd6f3f38cc9e584cef2f3c90ebe testfile.txt 

然而,試圖讓這永久的,失敗:

git filter-branch --tag-name-filter cat -- --all 

從git得到以下回復:

Rewrite e7619af3e5d424a144845c164b284875c4c20c7a (2/2) 
WARNING: Ref 'refs/heads/master' is unchanged 
WARNING: Ref 'refs/heads/master2' is unchanged 
error: Object bc705106db90164b2e688b4b190d4358f8b09a56 is a tree, not a commit 
error: Object bc705106db90164b2e688b4b190d4358f8b09a56 is a tree, not a commit 
fatal: ambiguous argument 'refs/replace/e7a75e980c7adc0d5ab1c49ecff082b518bb6cf8^0': 
    unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions, like this: 
'git <command> [<revision>...] -- [<file>...]' 
WARNING: Ref 'refs/replace/e7a75e980c7adc0d5ab1c49ecff082b518bb6cf8' is unchanged 

後,我取下更換參考,高手指點原來的樹回來:

git replace -d ${ORIG} 
git ls-tree master 

3b18e512dba79e4c8300dd08aeb37f8e728b8dad readme.txt 

爲什麼git filter-branch抱怨更換和我怎麼做 更換樹的永久的嗎?

P.S.我知道我可以用filter-branch --tree-filter或移植物做到這一點,但 (如何)可以用git replace來做到這一點?

+0

爲什麼你會用git替換它,當有其他方法時? – CodeFanatic

+1

我認爲我可以用樹型過濾器來做到這點,但這會慢很多,而且會更加笨重。我可以通過移植來實現,但http://stackoverflow.com/questions/6800692/how-do-git-grafts-and-replace-differ-are-grafts-now-deprecated和其他鏈接建議移植現在應該完成與git替換。 Ultimataly,我不明白爲什麼git對我的咒語不滿意,我想明白爲什麼。 – fraco

+1

我今天剛遇到同樣的問題。這個鏈接有一些相關的信息。 http://git.661346.n2.nabble.com/BUG-git-filter-branch-does-not-make-tree-replacements-permanent-td7582467.html – ChrisH

回答

2

使用$ git replace是不推薦的事情,但如果它的必要性,那麼你可以使用以下步驟做到這一點。

Step1:轉到您要替換的分支。

$ git checkout <your_branch_name> 

第二步:運行以下命令,得到SHA-1更換提交併更換提交。替換您可以在頂部獲得的提交SHA-1。並且您想要替換當前分支的替換提交SHA-1是您的選擇。

$ git log --status <your_branch_name> 

你會得到這樣的結果:

$ git log --status master 
commit d93378d4e774990160818038eb382f26b29f3c8f master                         
Author: rajesh <[email protected]>                        
Date: Tue Jul 22 19:00:15 2014 +0000                             

    latest commit                                 

commit 08eb045297566d38eec5f8c2c2f987ebd7fbc2b9 master                         
Author: rajesh <[email protected]>                        
Date: Wed Jul 16 06:44:17 2014 +0000                             

    updated file1.txt                                 

commit f4372c6c5d78eca13aa3017d72dc27f5bd38a08d master                         
Author: rajesh <[email protected]>                        
Date: Wed Jul 16 06:40:36 2014 +0000                             

    file1.txt                                   

commit 65614018eb46c797a49cedee97653bb7716b16c2 master                         
Author: rajesh <[email protected]>                          
Date: Wed Jul 16 12:03:55 2014 +0530                             

    Initial commit 

第三步:現在運行下面的命令來替換當前分支置換承諾。

$ git replace -f d93378d4e774990160818038eb382f26b29f3c8f f4372c6c5d78eca13aa3017d72dc27f5bd38a08d 

第4步:現在使用以下命令提交事物。

$ git commit -am 'getting replaced with commit of "file1.txt"' 

第五步:現在你可以檢查你在更換提交。

+0

步驟4是關於什麼的?這將是一個空的提交完成使用'git replace'所做的更改嗎? –

+0

那麼,第4步簡單地提交我在之前的步驟中所做的更改。 – rajeshwerkushwaha

+0

@rajeshwerkushwaha,爲什麼你建議'git replace'不是推薦的事情?我在文檔中沒有發現任何關於它的通知。 –