我在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”的正确输出。我做错了什么?
答案 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:
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)