我有一个运行Python脚本的客户端post-receive git hook。该脚本使用GitPython在HEAD和HEAD~1之间进行差异,找出已更改的文件的名称,然后编写一条推文,更新关注更改的关注者。
钩子本身只是一个运行python wikitweet.py
的shell脚本,Python脚本可以解决这个问题。
当我在推送后在远程端运行Python脚本时,一切正常。但是当我从本地推出时,我收到以下错误:
remote: Traceback (most recent call last):
remote: File "/home/wcm1/bin/wikitweet.py", line 21, in <module>
remote: most_recent_diff = repo.head.commit.diff('HEAD~1')
remote: File "/usr/lib/python2.6/site-packages/git/diff.py", line 111, in diff
remote: proc.wait()
remote: File "/usr/lib/python2.6/site-packages/git/cmd.py", line 309, in wait
remote: raise GitCommandError(self.args, status, self.proc.stderr.read())
remote: git.exc.GitCommandError: 'git diff c43a0b831612eb97f097458816d41aaa0506147d HEAD~1 --abbrev=40 --full-index -M --raw --no-color' returned with exit code 129
remote: stderr: 'usage: git diff [--no-index] <path> <path>
remote: '
之后推送掌握和更新复制工作就完成了。我可以从该错误消息中的提交哈希中判断出脚本是否成功获得了新的HEAD提交,因此,当钩子运行时,它似乎不是一个问题(我不这么认为)
我猜测我错误地理解了钩子,或者在我的Python脚本中做错了什么,但我很难理解为什么它在远程端运行但在推送后失败。以下是wikitweet.py
中似乎导致问题的相关行:
repo = git.Repo('/path/to/repo')
most_recent_diff = repo.head.commit.diff('HEAD~1')
changed_files = []
for x in most_recent_diff:
if x.a_blob.path not in changed_files:
changed_files.append(x.a_blob.path)
if x.b_blob is not None and x.b_blob.path not in changed_files:
changed_files.append(x.b_blob.path)
[...]
我也有不同版本的Python在远程和本地运行,但我不明白为什么会导致问题。
答案 0 :(得分:0)
由于使用post-receive
挂钩时git设置的环境变量,我收到了标准错误。解决方案是将此行添加到我的钩子中:
unset GIT_DIR
此页面提供了一些帮助我找出问题的helpful tips about hooks and environment variables。