我正在编写一个git服务器端钩子,它需要检查是否对不同的git文件夹(不同于该钩子所在的裸git存储库)进行了任何修改。为此,我编写了一个pre-receive
钩子,并尝试使用git status --porcelain
。脚本必须选择需要检查的文件夹,但现在我决定硬编码所有路径,直到我使其工作。你知道吗
到目前为止,当我把这个钩子作为python脚本运行时,它会给出正确的结果,但是当我把它作为钩子运行时,它会给我一个错误。你知道吗
UPD值得一提的是,该脚本是在ubuntulinux机器上执行的。在pyton上可以运行什么或者其他进程可以启动什么进程上有什么限制吗?升级版
以下是脚本本身:
#!/usr/bin/env python
import sys
import subprocess
import string
import os
print "PRE-RECEIVE HOOK >>>"
def git(args):
dirname = os.path.dirname("/home/git/repos/branchone/gitremote/")
print "Dirname = " + dirname
pr = subprocess.Popen( ["git","-C", dirname, "status", "--porcelain"], shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
(details, error) = pr.communicate()
print details, error
details = details.strip()
if error != "":
print "Errors: " + error
return None
return details
def pwd():
pwd = subprocess.Popen("pwd", stdout = subprocess.PIPE)
details = pwd.stdout.read().strip()
print "PWD:. " + details
def main():
git([])
pwd()
if \__name__ == "\__main__":
main()
sys.exit(2)
以下是我从cosole中对它的称呼:
root@remine-vm:/home/git/repos/gitremote.git# ./hooks/pre-receive
PRE-RECEIVE HOOK >>>
Dirname = /home/git/repos/branchone/gitremote
M eden
?? fruit
?? snake
以下是我尝试将某个东西推到遥控器时的反应:
Push: Not all refs have been pushed.
$ git.exe push --porcelain --progress --recurse-submodules=check origin refs/heads/branchone:refs/heads/branchone
'branchone' rejected (non-fast-forward)
Counting objects: 7, done.
Delta compression using up to 8 threads.
Total 6 (delta 0), reused 0 (delta 0)
remote: PRE-RECEIVE HOOK >>>
remote: Dirname = /home/git/repos/branchone/gitremote
remote: fatal: Not a git repository: '.'
remote:
remote: Errors: fatal: Not a git repository: '.'
remote:
remote: PWD:. /home/git/repos/gitremote.git
error: failed to push some refs to 'root@redmine-vm:/home/git/repos/gitremote.git'
通过向git命令添加更多键,即指定git dir和工作树的路径,修复了这个问题。
^{pr 1}$
这篇文章非常有用:http://longair.net/blog/2011/04/09/missing-git-hooks-documentation/
相关问题 更多 >
编程相关推荐