簡體   English   中英

沒有壁球的git-subtree:查看日志

[英]git-subtree without squash: view log

我使用git子樹添加而不使用squash選項將樹合並到我的存儲庫中。 git日志顯示提交已成功添加到存儲庫。 但是,如果我執行git log --follow filename ,則歷史記錄在合並處停止,並且不顯示先前的提交。 我嘗試使用-M而不是--follow ,這也不起作用。 如何在合並之前獲取特定文件或文件的提交日志?

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

實際上, git log --follow 應該與子樹合並一起使用,但是已知它很長時間都是hackish [1-3]。

可以堅持使用子樹合並和休息,以確保該策略對於跟蹤多個歷史記錄是有效的,並耐心地等待git log --follow將改善的不可避免的事件。 這實際上可能是一個可行的決定,因為目前git log --follow可以在非常有用的情況下看到一些歷史記錄。 假設您將文件從頂級倉庫移動到子倉庫,然后它可以跟蹤完整的移動。 當您想要跟蹤特定於子倉庫的歷史記錄時,您必須擁有單獨的副本或簽出子倉庫分支。

替代方案和解決方法

您可以獲取這些文件的日志[1]:

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

這將查看觸及名稱以filename結尾的文件的每個提交。 它不會遵循實際的重命名,如果你有幾個具有相同basename [1]的文件,它可能會顯示誤報。

您還可以使用不同的策略合並存儲庫。 Ref [4]顯示了一種方法,它與常規子樹合並非常接近,但具有可追溯的歷史。 基本上,你:

  1. 將每個子存儲庫添加,獲取並合並到頂層存儲庫作為常規遠程,無git子樹或readtree。 首先,這會將你的根目錄視為他們的根目錄,所以這應該在項目開始時完成。
  2. git mv將子repo文件分離到單獨的文件夾中

然后:

  • 可以正常獲取和合並上游更改,但使用-Xsubtree標志進行git merge。
  • 其他情況應該類似。 我已經測試了推進上游並且它有效,請參閱[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已經在Google Summer of Code 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM