我正在尝试在我的团队中执行一些编码规则。为此,我编写了许多客户端钩子,它们可以正常工作,但是现在我希望在开发人员将修改推送到中央存储库时运行相同的检查。但它们不起作用。
这是我想要做的:
我想逐行遍历推送文件,检查编码约定是否违规,如果发现任何违规,请拒绝推送,同时显示行号+违规行为。
在我的预提交客户端钩子中,我能够通过调用git diff --cached --name-status --diff-filter=AM
来获取已修改文件的列表,并且为第一次调用中检索到的每个文件git cat-file -p :filename
来获取整个文件的文本。
当我尝试在服务器端update
挂钩中执行相同操作时,我得到一个空字符串(对于文件列表)。
我也试过调用git show --pretty="format:" --name-only newrev
(其中newrev是我作为更新挂钩的参数获得的SHA,git diff-tree -r --name-only --no-commit-id <tree-ish>
,以及我在网上找到的其他一些东西,但我无法得到清楚地了解正在发生的事情以及我应该称之为什么。
你能帮助我吗?
答案 0 :(得分:4)
您必须对脚本进行更改,因为服务器端没有工作副本,而git diff --cached
适用于暂存区域(或索引),而当服务器收到推送时索引为空。 / p>
只需使用git diff --name-status <sha-old> <sha-new>
代替sha-old
和sha-new
作为参数发送到钩子的引用,您将获得与运行git diff --cached
相同的输出在提交之前。
至于检查文件内容,您可以使用git-show sha-new:/path/to/file