2014-01-15 77 views
2

我想知道當我的回購(或回購的子目錄)中的每個文件最近更改時提交。找出每個文件最後更改的提交方式?

git log -p some_file.txt將向我顯示單個文件的提交歷史記錄。

但是,我只想提交散列與文件名一起更改(理想情況下在一行)。另外,我想爲文件目錄(或者整個回購)做這件事。

所以基本上,我在尋找類似的輸出:

./file1.txt hash1 
./file2.txt hash1 
./file3.txt hash2 
./file4.txt hash3 
./file5.txt hash2 

其中哈希[n]是的提交該文件的最後修改散列。

我試過git log --pretty=oneline -p file1.txt,但在這種情況下--pretty被忽略。另外我想在輸出中包含文件名,而不是提交消息。

回答

1

使用一些腳本,你可以使用這個命令來獲取你所尋找的輸出:

find . -type f | egrep -v "(git)" | xargs -I {} git log -1 --pretty=format:'%H {}' {}

此找到您的文件夾中的所有文件,篩選出的git目錄然後用你正在查找的格式調用git log(雖然這一個首先有散列)

+0

「find」可以過濾出'.git'目錄本身,而不是管道到'egrep'中:'find。 -type f -not -path'* /。git/*'...'。 – Chris

+0

的確,我忘了使用它。 – Schleis

1

由於git存儲提交及其包含的文件(提交包含一個包含文件和其他樹的樹,但它們都是前向指針),所以沒有從文件返回樹的簡單引用(s )包含它,也不從一棵樹到另一棵樹或包含它的提交)。因此,僅在git中沒有簡單的方法。

這並不是說它不能完成,它只需要一些腳本。正如你所指出的,一種方法是簡單地做一個git log找到每個單獨文件被改變的最後一個地方 - 可能像git log -1 --pretty=format:%H -- <filename>。相反的方法是使用git ls-tree來獲取每個文件的當前SHA1,然後結合git log,git showgit ls-tree將每個文件映射到包含它的樹,然後將這些樹映射回最近的提交包含它們。我懷疑第一種方法會容易得多,儘管第二種方法可能會更好,如果您將各種哈希數組加載到例如Python的數組...

+0

好的,所以你建議使用格式爲%H的日誌可以工作。顯然這可能會變得很慢,但是我可以遍歷一個目錄併爲每個文件運行該文件,並以這種方式生成列表。謝謝! –

相關問題