Git server hook: get contents of files being pushed?

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-12 08:34:35

问题


I am trying to enforce some coding rules in my team. To that end, I've written a number of client-side hooks, which work all right, but now I want the same checks to run when a developer pushes their modifications to the central repository. But they don't work.

Here is what I want to do:

I want to traverse the pushed files line by line, check for coding conventions violations and if I find any, reject the push, also showing the line numbers + violations.

In my pre-commit client side hook I was able to do that by calling git diff --cached --name-status --diff-filter=AM to get the list of modified files, and git cat-file -p :filename for each of the files retrieved in the first call to get the whole text of the files.

When I try to do the same in my server-side update hook, I get an empty string (for the list of the files).

I also tried calling git show --pretty="format:" --name-only newrev (where newrev is the SHA I get as a parameter to the update hook, git diff-tree -r --name-only --no-commit-id <tree-ish>, and some other things I find on the net, but I can't get a clear understanding of what is going on and what I should call.

Can you help me?


回答1:


You have to make changes to your script because there's no working copy on the server side, and git diff --cached works with a staging area (or index), while your index is empty when the server receives a push.

Simply use git diff --name-status <sha-old> <sha-new> instead, with sha-old and sha-new being the refs sent to the hooks as an argument, and you'll get the same output as running git diff --cached before a commit.

As for checking file content, you can use git-show sha-new:/path/to/file



来源:https://stackoverflow.com/questions/15314527/git-server-hook-get-contents-of-files-being-pushed

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!