2012-06-06 59 views
10

我通過使用git subtree add而不使用壓扁選項,將一棵樹合併到我的存儲庫中。一個git日誌顯示提交已成功添加到存儲庫。但是,如果我執行git log --follow filename,則歷史記錄停止在合併中,並且不顯示以前的提交。我嘗試使用-M而不是--follow,這也不起作用。如何從合併之前獲取特定文件或文件的提交日誌?git-subtree without squash:查看日誌

回答

2

實際上,git log --follow應該與子樹工作合流,但它被稱爲是hackish的很長一段時間[1-3]。

一個人可以堅持子樹合併和休息,該策略是有效的跟蹤多個歷史,並耐心等待git log --follow將改善不可避免的事件。這實際上可能是一個可行的決定,因爲目前git log --follow可以在非常有用的案例中看到一些歷史。假設您將文件從頂級回購庫移至子回購庫,那麼它可以跟蹤整個移動。當你想追蹤特定於子回購的歷史記錄時,你必須有一個單獨的副本或檢查一個子回購分支。

替代方案和解決辦法

你可以得到日誌像這樣的文件[1]:

git log -- '*filename'   # from the toplevel 

此圖,各自提交感動他的名字 與filename結尾的文件。它不會遵循實際的重命名,並且如果您有多個具有相同基本名稱[1]的文件,則可能會顯示錯誤 肯定。

您還可以使用不同策略合併存儲庫。 參考文獻[4]顯示了一種方法,它與常規子樹合併的情況非常接近,但具有可跟蹤的歷史記錄。基本上,你:

  1. 作爲常規的遠程,沒有git子樹或讀取樹添加,提取和合並每個子存儲庫到頂級存儲庫。起初,這會將你的根目錄視爲是他們的目標,所以這是在項目開始的時候完成的。
  2. git mv子回購文件到不同的文件夾

然後:

  • 上游的變化可以被取出並且通常合併,但與-Xsubtree標誌與git合併。
  • 其他情況應該是相似的。我已經測試推動上游,它的工作原理,見[4]中的評論。

參考

[1]從git的郵件列表 http://git.661346.n2.nabble.com/Bug-Files-are-losing-history-after-subtree-merge-td7597197.html

[2]從git的郵件列表 http://git.661346.n2.nabble.com/gsoc-Better-git-log-follow-support-td6188083.html#a6188352

[3] git log --follow一直在代碼的谷歌暑期 https://git.wiki.kernel.org/index.php/SoC2011Ideas#Better_git_log_--follow_support

[4] https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history

+0

我相信#4應該是https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history/ –

+0

@BryanLarsen謝謝 – rfabbri

+0

For #4,'git log --follow'目前只適用於文件,不適用於文件夾。在子repo文件夾中的'git log --follow .'不會返回sub-repo提交,'gitk --follow .'(git 2.10.1) – rfabbri

14

git subtree mergegit subtree add創建的提交對來自子樹的文件進行「添加」,而不是「移動」。這意味着他們的歷史不能像其他合併或移動一樣被追蹤。

想要的文件的歷史記錄仍然可以通過在合併之前直接查看子樹來顯示。如果您的工作空間是git subtree創建的合併提交,那麼它的第二個父代(HEAD^2)將是原始子樹的最後一個提交。從這裏你可以看到原來的子樹的內容:

# Display the contents of the original subtree 
git ls-tree HEAD^2 

從這個承諾,你可以跟蹤你感興趣的文件的變化。請注意,文件的路徑在工作區中的子樹內會有所不同。您將需要刪除給git subtree--prefix,以便爲您的文件創建正確的路徑。

git log HEAD^2 --follow -- path-in-subtree/file 
+2

謝謝。由於這個問題,我們最終沒有使用子樹合併 - 如果我們使用了兩個單獨的存儲庫,其他人就更容易理解發生了什麼。子樹合併可以被*非高級git用戶視爲單個存儲庫,但這樣的小差異可能會讓人絆倒。所以我沒有測試你的答案,但絕對值得讚賞。 –

+1

請注意,git filter-tree可以成爲你這類東西的朋友。 –