查找git存储库中的所有已删除文件以及删除它们的人员

时间:2014-09-30 09:27:13

标签: python git

我有一个使用Git进行版本控制的项目。在这个项目中有一个文件的“网格”,其组织方式如

/parts
  /a
    01.src
    02.src
    ...
    90.src
  /b
    01.src
    02.src
    ...
    90.src
  /...

(这个问题无关紧要,但也许知道这些编号的文件是乐谱中的小切片可能会有所帮助。)

这些编号的文件是由脚本生成的,我们工作的一部分是删除那些未在乐谱中使用的文件。

现在,我想检索删除每个文件的信息(作为项目文档和工作流程的一部分)。信息检索是从Python脚本完成的。

我有一种工作方法,但效率极低,因为它将Git称为每个文件的子进程,可能远远超过1.000倍。

我能做的是调用目录树中缺少的每个文件:

git log --pretty=format:"%an" --diff-filter=D -- FILENAME

这为我提供了影响文件的最后一次删除提交的作者姓名。这工作正常,但正如我所说,我必须为每个已删除的文件生成一个新的子进程。

我可以在shell上执行相同的for循环:

for delfile in $(git log --all --pretty=format: --name-only --diff-filter=D | sort -u); do echo $delfile: $( git log --pretty=format:"%an" --diff-filter=D -- $delfile); done

但这真的很慢,这是可以理解的,因为它为每个文件生成一个新的git调用(就像我从Python那样做)。

所以底线是:是否有一种有效的方式向Git询问

  • 已从存储库中删除的所有文件
    (可能限于子目录)
  • 以及触及每个文件的最后一次提交的作者姓名
    (或实际上:删除文件的作者)

1 个答案:

答案 0 :(得分:0)

我的上一次评论似乎让我自己走上正轨:

git log --diff-filter='D|R' --pretty=format:'%an' --name-only parts

给了我正确的选择:

--diff-filter过滤正确的提交 --pretty=format:'%an'仅返回作者
--name-only返回已删除文件的列表

因此,我得到类似

的内容
Author-1
deleted-file-1
deleted-file-2

Author-2
deleted-file-3
deleted-file-4

Author-1
deleted-file-5

这并没有提供有关提交的任何更多信息,但我不需要那些用于我的用例。这个结果可以在Python中轻松处理。

(对于任何登陆此paeg的人:如果您需要类似的东西,但也想要有关结果的信息,您可以修改--pretty=format:'..'选项。请参阅http://git-scm.com/book/en/Git-Basics-Viewing-the-Commit-History以获取可能的项目列表显示)