32

I want to get a list of changed files of the current git-repo. The files, that are normally listed under Changes not staged for commit: when calling git status.

So far I have managed to connected to the repository, pulled it and show all untracked files:

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

But now I want to show all files, that have changes (not commited). Can anybody push me in the right direction? I looked at the names of the methods of repo and experimented for a while, but I can't find the correct solution.

Obviously I could call repo.git.status and parse the files, but that isn't elegant at all. There must be something better.


Edit: Now that I think about it. More usefull would be a function, that tells me the status for a single file. Like:

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

2 Answers 2

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

or to get just the list:

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

repo.index.diff() returns git.diff.Diffable described in http://gitpython.readthedocs.io/en/stable/reference.html#module-git.diff

So the function can look like this:

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"
Sign up to request clarification or add additional context in comments.

5 Comments

Are you not supposed to pass HEAD instead of None to diff function ?
@Ciastopiekarz The documentation says that None means to compare against the working tree, see gitpython.readthedocs.io/en/stable/…
This does not return new added files @BartBiczBoży
I have not been able to get a list of files that changed since the last pull using this method.
same here, not returning anythin
6

just to catch up on @ciasto piekarz question: depending on what you want to show:

repo.index.diff(None)

does only list files that have not been staged

repo.index.diff('Head')

does only list files that have been staged

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.