5

到目前为止,我的代码正在执行以下操作。我想摆脱 subprocess.call() 的东西

import git
from subprocess import call

repo = git.Repo(repo_path)
repo.remotes.origin.fetch(prune=True)
repo.head.reset(commit='origin/master', index=True, working_tree=True)

# I don't know how to do this using GitPython yet.
os.chdir(repo_path)
call(['git', 'submodule', 'update', '--init'])
4

2 回答 2

17

我的简短回答:它既方便又简单。

完整答案如下。假设你有你的 repo 变量:

repo = git.Repo(repo_path)

然后,只需执行以下操作:

for submodule in repo.submodules:
    submodule.update(init=True)

你可以用你的子模块做所有的事情,就像你通过普通的 repo 做的一样submodule.module()(它是 type git.Repo),如下所示:

sub_repo = submodule.module()
sub_repo.git.checkout('devel')
sub_repo.git.remote('maybeorigin').fetch()

我在自己的瓷器中使用这些东西,而不是用来管理一些项目的 git瓷器。


此外,要更直接地执行此操作,您可以不使用call()or subprocess,而是执行以下操作:

repo = git.Repo(repo_path)
output = repo.git.submodule('update', '--init')
print(output)

您可以打印它,因为该方法返回您通常通过运行获得的输出git submodule update --init(显然该print()部分取决于 Python 版本)。

于 2015-06-04T12:48:51.923 回答
-1

简短的回答:你不能。

完整答案:你不能,也没有意义。GitPython不是整个 Git 的完整实现。它只是为一些常见的事情提供了一个高级接口。虽然一些操作是直接在 Python 中实现的,但很多调用实际上使用Git 命令行界面来处理内容。

例如,您的fetch线路就是这样做的。在幕后,有一些技巧用来使某些调用看起来像 Python,尽管它们调用 Git 可执行文件来处理结果——也使用子进程。

因此,您可以尝试弄清楚如何使用 GitPython 提供的 git cmd 接口来支持这些调用(您可以使用 访问该 cmd 处理程序的实例repo.git),或者您直接继续使用“无聊”的子进程调用。

于 2014-04-08T22:12:49.703 回答