2014-01-15 43 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的日志可以工作。显然这可能会变得很慢,但是我可以遍历一个目录并为每个文件运行该文件,并以这种方式生成列表。谢谢! –

相关问题