2012-03-19 162 views
15

我們一直試圖讓git-subtree在一個項目上工作(使用git版本1.7.9.4)並且遇到了一些複雜情況。別人以前添加的子樹用這個命令在幾個月前:git-subtree pull併發症

git subtree add --prefix=foo [email protected]:foo.git master 

現在已經出現了實質性的變化foo,我們希望在這些變化進行合併,理想的擠壓他們的文件無已。自從它們被導入後被修改。

我已經嘗試了三件事情來嘗試並在變化中合併。

第一:

git subtree pull --squash -P foo [email protected]:foo.git master 

會拋出異常:Can't squash-merge: 'foo' was never added.

二:

git subtree pull -P foo [email protected]:foo.git master 

這工作(在某種程度上),但在所有提交的拉動問題並與已修改的文件發生衝突。

最後,我想這一點:

git pull --squash -s subtree [email protected]:foo.git master 

這給了我想要的結果,與輸出Automatic merge went well; stopped before committing as requested和所有的文件顯示爲修改(與正確的內容)。

理想情況下,我想繼續使用第一個git-subtree版本,並獲得接近最後一個版本的輸出。如果我們必須一直使用最後一個版本,那麼我們會這麼做,但是我對於爲什麼最後一個版本不會產生合併衝突而中間產生衝突有點困惑。

任何幫助表示讚賞。

回答

6

我有同樣的問題,在我看來,這似乎是由於初始子樹提交被合併壓入主分支。

通過子樹源,我發現這個展望:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224

它看起來像樹裏grep你的git日誌git-subtree-dir: foo,但沒有找到合適的提交。試試git log --grep="git-subtree-dir: foo/*\$",如果這個提交有些奇怪,比如它是一個合併提交,那可能是問題。

除了令人討厭的合併衝突之外,只要不拔手就可以爲我工作。我在一個臨時分支中完成了這項工作,然後我將git merge --squash編入了另一個分支,以避免更加混亂的歷史。當然,它可能已經被重新設計了。

+1

我遇到了同樣的問題,原因是我在嘗試拉動時錯過了前綴選項中的子文件夾。將此添加爲註釋,因爲錯誤消息沒有給出任何關於此錯誤的指示,並且故障排除使我在此處找到了答案。 – 2015-12-08 18:25:57

+0

謝謝,這很有用。我有一個相關的問題,在將子樹添加到其中後,我移動了該子目錄,這看起來好像讓這個匹配成功了 – 2017-01-04 21:20:45

1

我每次在子樹上執行操作時,都遇到了與sourcetree 1.7.0相同的錯誤Can't squash-merge: 'foo' was never added.。 但是,我相信我的情況是不同的,因爲我使用的是子目錄。

Sourcetree做了如下:
git -c diff.mnemonicprefix=false -c core.quotepath=false subtree pull -P dir1\subdir1 --squash remote-repo master

而且很明顯,如果我們要在Git中的Bash(GIT版本2.6.1.windows再次嘗試。1),它應該是:
git subtree pull -P "dir1\subdir1" --squash remote-repo master

但是失敗了。下面也未能雖然命令語法是罰款:
git subtree pull -P dir1/subdir1 --squash remote-repo master

我發現使它工作的解決方案是使用的Git Bash的使用下面的命令:
git subtree pull -P "dir1/subdir" --squash remote-repo master

我想這還是有一些Git的命令行處理引擎需要完成的工作。