10

我正在尝试在我的团队中执行一些编码规则。为此,我编写了许多客户端钩子,它们可以正常工作,但现在我希望在开发人员将他们的修改推送到中央存储库时运行相同的检查。但它们不起作用。

这是我想做的事情:

我想逐行遍历推送的文件,检查是否违反编码约定,如果发现任何,拒绝推送,同时显示行号+违规。

在我的预提交客户端钩子中,我可以通过调用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>,以及我在网上找到的其他一些东西,但我无法清楚地了解正在发生的事情以及我应该调用什么.

你能帮助我吗?

4

1 回答 1

6

您必须对脚本进行更改,因为服务器端没有工作副本,并且git diff --cached使用暂存区域(或索引),而当服务器收到推送时您的索引为空。

只需使用git diff --name-status <sha-old> <sha-new>sha-old作为sha-new参数发送到钩子的引用,您将获得与git diff --cached在提交之前运行相同的输出。

至于检查文件内容,您可以使用git show sha-new:/path/to/file

于 2013-03-09T18:58:12.870 回答