通过GIT中钩执行Python子(Executing python subprocess via g

2019-09-17 20:57发布

我跑Gitolite在Git仓库,我有后收到钩有Python编写的。 我需要在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的手动运行该脚本,它的工作原理正确,并显示“混帐日志”的正确的输出。 我做错了吗?

Answer 1:

你可以尝试使用命令行开关来设置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和重写时,只适用于在OP 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)


Answer 2:

有一个逗号CWD争吵后失踪:

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


文章来源: Executing python subprocess via git hook