2017-09-05 115 views
1

比方說,我創建了這樣的樹:的Git樹:移動子樹到不同的目錄,並把它

git subtree --add --prefix=subdir <path_to_remote> <remote_branch> --squash 

然後,我想移動/重命名子目錄,所以我這樣做: git的MV子目錄DIR2 /子目錄

現在,當我試圖將其子樹拉來一個新的前綴:

git subtree --pull --prefix=dir2/subdir <path_to_remote> <remote_branch> --squash 

混帳說:

Can't squash-merge: 'dir2/subdir' was never added. 

我該如何正確地做到這一點?

回答

1

git subtree命令知道你的樹,因爲它在商店的名字,當你add子樹第一次提交:

Add 'subdir/' from commit 'c7fbc973614eced220dcef1663d43dad90676e00' 

git-subtree-dir: subdir 
git-subtree-mainline: c166dc69165f6678d3c409df344c4ed9577a2e11 
git-subtree-split: c7fbc973614eced220dcef1663d43dad90676e00 

git subtree pull--squash選項查找提交包含git-subtree-dir找到most-最近從遠程倉庫提交,因此應用和壓縮所有提交的點。

在許多情況下,git subtree split --rejoin操作會成功:

$ git subtree split --rejoin --prefix=dir2/subdir HEAD 
Merge made by the 'ours' strategy. 
25070c483647f8136655d0e0c6c3d62f469177aa 

得到的承諾看起來像:

Split 'dir2/subdir/' into commit '25070c483647f8136655d0e0c6c3d62f469177aa' 

git-subtree-dir: dir2/subdir 
git-subtree-mainline: 59cc3c770e78dbc30bdfe36a6b4e14ce83b38f6c 
git-subtree-split: 25070c483647f8136655d0e0c6c3d62f469177aa 

這承諾會被發現而下git subtree pull --squash在大多數情況下取得成功。請注意,有時子樹操作會失敗,並在您的repo的工作副本中留下子樹的分支。確保刪除任何剩餘的臨時分支以開始一個乾淨的石板。

有時上述操作不成功,但我從來沒有找到原因。在這些情況下,您可以重新綁定到添加子樹的提交,並通過修改提交消息手動更改目錄名稱。不過,這個操作會腐蝕你所有人的整個歷史。

+0

謝謝,那對我有效!既然你說git子樹只是在提交消息中查找文本,我試圖添加必要的文本來提交重命名,但正如你所說的 - 以我的工作副本中的子樹分支結束。 – Amomum