我跑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的手动运行该脚本,它的工作原理正确,并显示“混帐日志”的正确的输出。 我做错了吗?
你可以尝试使用命令行开关来设置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)
有一个逗号CWD争吵后失踪:
proc = subprocess.Popen(['git', 'log', '-n1'], cwd='/home/git/repos/testing.git', stdout=subprocess.PIPE, stderr=subprocess.PIPE)