gpt4 book ai didi

python - 通过 git hook 执行 python 子进程

转载 作者:太空狗 更新时间:2023-10-29 14:40:00 24 4
gpt4 key购买 nike

我在 Git 存储库上运行 Gitolite,我在那里有用 Python 编写的接收后 Hook 。我需要在 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”的正确输出。我做错了什么?

最佳答案

您可以尝试使用命令行开关设置 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)

显然 hooks 已经设置了 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)

关于python - 通过 git hook 执行 python 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com