2017-02-21 39 views
3

我想在重命名完成之前(當然是自動檢測)看到過去重命名的文件的內容。git show file with rename detection(相當於git log --follow)

With git log --follow foo_renamed.txt and git show master~20 foo_original_name.txt我可以確認git能夠跟蹤文件重命名並且文件存在於master~20中。然而,

git show --follow master~20:foo_renamed.txt 

git show -M master~20:foo_renamed.txt 

都失敗,

致命:路徑 'foo_renamed.txt' 存在於磁盤上,而不是在 '高手〜20'。

這實際上是有道理的,因爲對象規範是<rev>:<path> BLOB但沒有-- /file/path選項git show。任何其他方式?謝謝。

回答

2

不幸的是,沒有。只有git log --follow實現了特殊情況hack來跟蹤這些類型的檢測到的重命名(它們必須被檢測到,一次一個地提交,而在回溯歷史時),並且它用不太適合該任務的代碼來執行。

如果你想在Git上工作,應該可以修改代碼使其更加靈活,並且可以添加一個選項git show,你可以給git show一個提交的ID,它是目標提交的後代,但確實有有文件。然後,Git將不得不按照git log的方式進行修改,執行重命名檢測(但使用更靈活的代碼),以便當commit-graph walk達到要顯示的提交時,Git將能夠使用更早的名稱。

調用可能是這樣的:

git show --follow[=<start>] commit -- path 

其中<start>默認爲HEAD。不過,這是一件不平凡的事情。

(另外,git show應該拒絕--follow現在;事實上,它允許它在所有是一個小錯誤。)

1

我相信,如果託雷克說git show不能做到這一點,現在這是當前情況。

我現在的解決方法是:

git show master~42:`git log --follow master~42..master \ 
--name-only --oneline -- path/to/file | tail -n1`