通过git hook执行python子进程

时间:2012-06-07 16:18:46

标签: python git subprocess pipe

我在Git存储库上运行Gitolite,我在Python中编写了post-receive hook。我需要在git repository目录下执行“git”命令。几行代码:

proc = subprocess.Popen(['git', 'log', '-n1'], cwd='/home/git/repos/testing.git' stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()

在我进行新提交并推送到存储库后,脚本执行并说

fatal: Not a git repository: '.'

如果我跑

proc = subprocess.Popen(['pwd'], cwd='/home/git/repos/testing.git' stdout=subprocess.PIPE, stderr=subprocess.PIPE)

它按照预期说,正确的git存储库路径(/home/git/repos/testing.git)

如果我从bash手动运行此脚本,它的工作正确并显示“git log”的正确输出。我做错了什么?

2 个答案:

答案 0 :(得分:4)

您可以尝试使用命令行开关设置git存储库:

proc = subprocess.Popen(['git', '--git-dir', '/home/git/repos/testing.git', 'log', '-n1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

--git-dir需要指向实际的git目录(工作树中的.git)。请注意,对于某些命令, 也需要设置--work-tree选项。

设置目录的另一种方法是使用GIT_DIR环境变量:

import os
env = os.environ.copy()
env['GIT_DIR'] = '/home/git/repos/testing.git'
proc = subprocess.Popen((['git', 'log', '-n1', stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)

显然挂钩已设置GIT_DIR但显然这对你的情况不正确(可能是相对的);上面的代码将它设置为一个完整的显式路径。

请参阅git manpage

编辑:显然它只适用于指定cwd和覆盖GIT_DIR var:

的OP
import os
repo = '/home/git/repos/testing.git'
env = os.environ.copy()
env['GIT_DIR'] = repo
proc = subprocess.Popen((['git', 'log', '-n1', stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd=repo)

答案 1 :(得分:0)

cwd参数后缺少逗号:

proc = subprocess.Popen(['git', 'log', '-n1'], cwd='/home/git/repos/testing.git', stdout=subprocess.PIPE, stderr=subprocess.PIPE)