2014-04-08 74 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處理程序的實例),或者您只需繼續使用「無聊」的子進程調用直。