2013-03-19 32 views
1

我想比較git倉庫中的兩個文件,並告訴哪一個是早些時候(通過血統,而不是時間戳)引入倉庫。這樣做的天真方式是找到引入文件的單個提交(rev-list HEAD -- <filename> | tail -n 1),並查詢它們之間是否有提交(rev-list commit1 ^commit2)。然而,這是緩慢和愚蠢的。那麼平分歷史直到我們找到一棵包含一個文件但不包含另一個文件的樹?哪個文件歷史悠久?

回答

0

使用diff過濾= A

git log --reverse --format=%H --name-status --diff-filter=A -- file1 file2 | grep ^A | cut -f2 

對於任意數量的文件,你會得到所需要的排序在一個遍歷。

0

根據我瞭解你,畢竟這可能是你在找什麼:

git log --topo-order --reverse --oneline --name-only --pretty=format:"%Cgreen%ci %Cblue%cr %Cred%cn %Cgreen%h %Creset" <file1> <file2> | head -n10 

--topo階
顯示其所有的孩子之前沒有父母顯示,並避免在多行歷史記錄中混合顯示提交。

- 反向
以相反的順序輸出提交。

請參閱:git-log瞭解更多選項和可能的組合。

+0

添加'--remove-empty'可能會讓它更快:請參閱[爲什麼「git log 」緩慢?](https://git.wiki.kernel.org/index.php/Git_FAQ#Why_is_.22git_log_ .3Cfilename.3E.22_slow.3F)(還有其他一些相關信息) – tcovo 2013-03-19 03:57:53

1

除非在同一個線性分支中引入的文件(即一個在另一個的祖先中)沒有辦法知道。假設你在你的回購中引入了文件A,並且我在我的文件中引入了文件B.如果以後我從你的回購克隆中克隆出來,那麼無法知道哪一個是先出現的。當然,我們可以同步時鐘,但這不屬於git。 git的「時間」唯一的概念是祖先關係,其他人只是沒有可比性。

+0

這個普遍真理與我的問題有什麼關係?我特別說「祖先」:輸出應該是1. file1早於file2,2. file2早於file1,或3.關係未定義。 – artagnon 2013-03-20 20:16:38