我有一个使用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询问
答案 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以获取可能的项目列表显示)