Git预提交钩子:获取更改文件列表

15

我正在开发验证和代码检测工具,以便与各种提交钩子(包括Git钩子)集成。

https://github.com/miohtama/vvv

目前在每次提交时对整个项目代码库运行验证器和代码检测器。然而,只针对更改的文件运行它们会更加优化。为此,我需要在我的Git precommit钩子(使用Python语言)中知道更改的文件列表。

https://github.com/miohtama/vvv/blob/master/vvv/hooks/git.py

我有哪些选项可以提取更改的文件列表(使用Python语言)?

2个回答

7

如果你真的想让事情“正确”地工作,那么预提交钩子可能会有点麻烦,因为工作树中的内容不一定与要提交的内容相同:

$ echo morestuff >> file1; echo morestuff >> file2
$ git add file1 # but not file2
$ git commit -m 'modified two files but check in just one'

你可以使用git diff-index --cached HEAD命令获取“即将被提交的内容”列表。此外,也可以参考http://newartisans.com/2009/02/building-a-better-pre-commit-hook-for-git/等文章。

对于这篇文章链接而言:为了检查哪些文件已更改,保留仓库的第二份副本实在是很痛苦 :( - Mikko Ohtamaa
你不需要一个仓库的第二份副本,但是根据你正在做的事情,你可能需要第二个工作树。基本上有两种选择:在其他地方检出索引,以便获得与要检查的内容匹配的工作树;或者验证当前的工作树是否“干净”,以便您可以使用当前目录(预提交钩子在工作树中运行)。 - torek
2
目前为止,它完美地运作。这是完整的解决方案 https://github.com/miohtama/vvv/blob/master/vvv/hooks/git.py - Mikko Ohtamaa
快速扫描Python代码后,可以使用sys.exit("some string")代替print("some string"); sys.exit(1)。您还可以使用git diff -z ...,然后在\x00字节处拆分输出。 - torek
为确保您的测试套件在提交结果上运行,请使用git stash。请参阅http://codeinthehole.com/writing/tips-for-using-a-git-pre-commit-hook/。 - user1071136
@user1071136:在git stash中有一个小错误,如果索引版本有更改并且当前工作目录版本将其更改回先前提交中的内容(即HEAD),则git stash --keep-index会丢失工作目录版本。(当然,这仍然在HEAD中。但是,在预提交钩子中使用git stash会出现一些问题。) - torek

1
这并不是对此问题的直接回答 - 但我在寻找类似于使用npm进行JavaScript解决方案时发现了这个。
通过进一步搜索,我相信使用lint-staged库,npm已经解决了这个问题。这将仅对暂存文件进行检查。
我在搜索时遇到的问题是,我总是在寻找“pre-commit”钩子检查而不是“staged file”检查。因此,我在这里为像我这样的任何人提供此答案,他们在搜索JavaScript解决方案时会来到这里。
希望npm包也能给Python世界带来一些启示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接