2013-03-09 98 views
8

我想在我的团队中执行一些编码规则。为此,我编写了一些客户端钩子,这些钩子都可以正常工作,但是现在我希望在开发人员将其修改推送到中央存储库时运行相同的检查。但他们不工作。Git服务器挂钩:获取正在推送的文件内容?

这是我想做的事:

我想横越线路推档线,检查编码约定违规行为,如果我狼狈不堪,拒绝推送,也显示行数+违法行为。

在我的预提交客户端钩我能做到这一点通过调用git diff --cached --name-status --diff-filter=AM得到修改的文件列表,并git cat-file -p :filename每个在第一次调用检索得到的文件的全部文本文件。

当我尝试在我的服务器端update钩子做同样的事情时,我得到一个空字符串(用于文件列表)。

我也打过电话git show --pretty="format:" --name-only newrev(其中NEWREV是SHA我得到作为参数传递给update挂钩,git diff-tree -r --name-only --no-commit-id <tree-ish>,以及一些其他的事情,我在网络上找到的,但到底是怎么回事,我不能得到明确的认识对,我应该叫什么。

你能帮助我吗?

+0

什么是使用'git的猫file'过'cat'的好处。我试图搜索,但无法罚款一个令人信服的理由。 – 2015-09-21 14:31:23

回答

4

你必须要改变你的脚本,因为有在服务器端没有工作拷贝,并git diff --cached作品用的临时区域(或指数),而当服务器收到推送请求时,您的索引是空的。

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

作为确认文件内容,你可以使用git-show sha-new:/path/to/file

+0

奇怪的是,我仍然得到一个空字符串...我不知道它是否重要,但我推入一个空的遥控器,而当我推,git说它是“写27个对象”,那似乎是推并不是空的。 – Ibolit 2013-03-09 19:06:00

+0

推我的第一次提交后,现在我可以推,我得到的文件列表。非常感谢! – Ibolit 2013-03-09 19:15:41