使用GitPython,我该怎么做git子模块更新--init

时间:2014-04-08 22:01:28

标签: python gitpython

到目前为止,我的代码正在执行以下操作。我想摆脱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'])

2 个答案:

答案 0 :(得分:10)

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

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

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()

您可以打印它,因为该方法会返回您通常通过运行SELECT * FROM table WHERE Activities = '{$activities}' AND Climate = '{$climate}' AND Continent = '{$continent} 获得的输出(显然tx = graph.cypher.begin() tx.append("my cypher statement, i.e. MATCH STUFF") tx.process() .... tx.commit() 部分depends on Python version)。

答案 1 :(得分:0)

简短的回答:你不能。

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

您的fetch行就是这样做的。虽然他们调用Git可执行文件来处理使用结果的子进程,但有一些trick used可以使一些调用看起来像Python。

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