繁体   English   中英

通过 python 子进程 Git 添加

[英]Git add through python subprocess

我正在尝试通过 python 子进程运行 git 命令。 我通过调用 github 的 cmd 目录中的 git.exe 来做到这一点。

我设法使大多数命令正常工作(init、remote、status),但是在调用 git add 时出现错误。 到目前为止,这是我的代码:

import subprocess

gitPath = 'C:/path/to/git/cmd.exe'
repoPath = 'C:/path/to/my/repo'
repoUrl = 'https://www.github.com/login/repo';

#list to set directory and working tree
dirList = ['--git-dir='+repoPath+'/.git','--work-tree='+repoPath]


#init gitt
subprocess.call([gitPath] + ['init',repoPath]

#add remote
subprocess.call([gitPath] + dirList + ['remote','add','origin',repoUrl])

#Check status, returns files to be commited etc, so a working repo exists there
subprocess.call([gitPath] + dirList + ['status'])

#Adds all files in folder (this returns the error)
subprocess.call([gitPath] + dirList + ['add','.']

我得到的错误是:

fatal: Not a git repository (or any of the parent directories): .git

所以我搜索了这个错误,我发现的大多数解决方案都是关于不在正确的目录中。 所以我的猜测也是如此。 但是,我不知道为什么。 Git 状态返回目录中的正确文件,我已经设置了 --git-dir 和 --work-tree

如果我去 git shell,我添加文件没有问题,但我找不到这里出错的原因。

我不是在寻找使用 pythons git 库的解决方案。

您需要指定工作目录。

功能Popencallcheck_callcheck_outputcwd关键字参数的话,比如:

subprocess.call([gitPath] + dirList + ['add','.'], cwd='/home/me/workdir')

另请参阅为 popen 指定工作目录

除了使用cwd Popen 的参数,您还可以使用 git 的标志-C

usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

所以它应该是这样的

subprocess.Popen('git -C <path>'...)

在 Python 2 中,这对我有用。

import subprocess 

subprocess.Popen(['git', '--git-dir', '/path/.git', '--work-tree', '/work/dir', 'add', '/that/you/add/file'])

自 Python 3.5 起,您可以为此使用 subprocess.run

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=无,文本=无,环境=无,universal_newlines=无,**other_popen_kwargs)¶

import subprocess
subprocess.run(["git", "clone", "https://github.com/VundleVim/Vundle.vim.git", folder], check=True, stdout=subprocess.PIPE)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM