2

我在 Git 存储库上运行 Gitolite,我在那里有用 Python 编写的 post-receive 钩子。我需要在 git 存储库目录中执行“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”的正确输出。我做错了什么?

4

2 回答 2

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手册页

编辑:显然,它仅在指定 cwd 并覆盖GIT_DIRvar 时适用于 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)
于 2012-06-07T16:38:38.090 回答
0

cwd 参数后缺少逗号:

proc = subprocess.Popen(['git', 'log', '-n1'], cwd='/home/git/repos/testing.git', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2012-06-07T16:37:26.553 回答