2015-11-16 130 views
4

我想獲取當前git-repo的已更改文件的列表。當調用git status時,通常在Changes not staged for commit:下列出的文件。使用gitpython獲取更改的文件

到目前爲止,我已經成功地連接到存儲庫,把它和顯示所有未跟蹤文件:

from git import Repo 
repo = Repo(pk_repo_path) 
o = self.repo.remotes.origin 
o.pull()[0] 
print(repo.untracked_files) 

但現在我想告訴所有的文件,有變化(不COMMITED)。任何人都能把我推向正確的方向嗎?我查看了repo方法的名稱並嘗試了一段時間,但我找不到正確的解決方案。

顯然我可以打電話repo.git.status並解析這些文件,但那根本不算優雅。必須有更好的東西。


編輯:現在我想到了。更有用的將是一個函數,它告訴我單個文件的狀態。像:

print(repo.get_status(path_to_file)) 
>>untracked 
print(repo.get_status(path_to_another_file)) 
>>not staged 
+1

可能的重複[如何使用GitPython獲取分階段文件?](http://stackoverflow.com/questions/31959425/how-to-get-staged-files-using-gitpython) – user38034

回答

3
for item in repo.index.diff(None): 
    print item.a_path 

或得到公正名單:

changedFiles = [ item.a_path for item in repo.index.diff(None) ] 

repo.index.diff()返回git.diff.Diffable在http://gitpython.readthedocs.io/en/stable/reference.html#module-git.diff描述

這樣的功能可以看看像這樣:

def get_status(repo, path): 
    changed = [ item.a_path for item in repo.index.diff(None) ] 
    if path in repo.untracked_files: 
     return 'untracked' 
    elif path in changed: 
     return 'modified' 
    else: 
     return 'don''t care' 
+0

你不應該通過'HEAD'而不是'無'到'diff'功能? –

+0

@Ciastopiekarz文檔說'None'意味着與工作樹進行比較,參見http://gitpython.readthedocs.io/en/stable/reference.html?highlight=diffable#git.diff.Diffable.diff –