2014-04-08 72 views
0

到目前为止,我的代码正在执行以下操作。我想摆脱subprocess.call()的东西使用GitPython,我该如何做git子模块更新--init

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']) 

回答

6

我的简答:它很方便,很简单。

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

repo = git.Repo(repo_path) 

然后,根本看:

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

并且你可以通过submodule.module()做你的子模块,你与你的普通回购做的事情(这是类型git.Repo)是这样的:

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

我在我自己的瓷过了Git瓷使用这样的事情,我用它来管理一些项目。


此外,为了更直接地做到这一点,就可以了,而不是使用call()subprocess,只是这样做:

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

可以打印,因为该方法返回的输出,你通常得到运行git submodule update --init(显然是print()部分depends on Python version)。

0

简短的回答:你不能。

完整答案:你不能,也没有意义。 GitPython不是完整的Git实现。它只是为一些常见的东西提供高级接口。虽然一些操作直接在Python中实现,但很多调用实际上都使用Git command line interface来处理内容。

你的fetch行例如做到这一点。在底层,有一些trick used使得一些调用看起来像Python,尽管他们也调用Git可执行文件来处理结果使用子进程。

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