找出每个文件最后更改的提交?

时间:2014-01-15 18:30:09

标签: git github

我想知道我的repo(或我的repo的子目录)中的每个文件最近都被更改时的提交。

git log -p some_file.txt将显示单个文件的提交历史记录。

但是,我只想提交它与文件名一起更改的提交哈希值(理想情况是在一行上)。另外,我想为文件目录(或整个仓库)执行此操作。

基本上,我正在寻找类似于:

的输出
./file1.txt  hash1
./file2.txt  hash1
./file3.txt  hash2
./file4.txt  hash3
./file5.txt  hash2

其中hash [n]是上次修改文件的提交的哈希值。

我尝试了git log --pretty=oneline -p file1.txt,但在这种情况下忽略了--pretty。另外,我想在输出中包含文件名而不是提交消息。

2 个答案:

答案 0 :(得分:1)

由于git存储提交的方式及其包含的文件(提交包含一个包含文件和其他树的树,但这些都是前向指针),因此没有简单的引用从文件返回到包含它的树,也不是从树到另一棵树或包含它的树。因此,单凭git没有简单的方法可以做到这一点。

但这并不是说它无法完成 - 它只需要一些脚本。正如您所指出的,一种方法是简单地执行git log来查找每个文件更改的最后位置 - 可能类似于git log -1 --pretty=format:%H -- <filename>。相反的方法是使用git ls-tree获取每个文件的当前SHA1,然后使用git loggit showgit ls-tree的组合将每个文件映射到树( s)包含它,然后将这些树映射回包含它们的最新提交。我怀疑第一种方法会更容易,虽然第二种方法可能会表现得更好,如果您将各种哈希的数组加载到例如Python数组......

答案 1 :(得分:1)

使用某些脚本,您可以使用此命令获取您要查找的输出:

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

这会查找文件夹中的所有文件,过滤掉git目录,然后使用您要查找的格式调用git log(尽管这个文件首先包含哈希值)