10

I am using this for loop to loop through all commits:

repo = Repo("C:/Users/shiro/Desktop/lucene-solr/")
for commit in list(repo.iter_commits()):
    print commit.files_list  # how to do that ?

How can I get a list with the files affected from this specific commit ?

dimitris93
  • 4,155
  • 11
  • 50
  • 86

4 Answers4

23

Try it

for commit in list(repo.iter_commits()):
    commit.stats.files
  • Keep in mind that this method is *very* slow. It runs `git diff --numstat`, which calculates a lot more than just the file list. – nicbou Apr 07 '23 at 09:21
0
from git import Repo
repo = Repo('/home/worldmind/test.git/')
prev = repo.commit('30c55d43d143189698bebb759143ed72e766aaa9')
curr = repo.commit('5f5eb0a3446628ef0872170bd989f4e2fa760277')
diff_index = prev.diff(curr)
for diff in diff_index:
    print(diff.change_type)
    print(f"{diff.a_path} -> {diff.b_path}")
Alexey Shrub
  • 1,216
  • 13
  • 22
0

commit.stats.files works, but it's very slow. It will take several seconds to process a large commit.

This is much faster:

repo = Repo("C:/Users/shiro/Desktop/lucene-solr/")
for commit in list(repo.iter_commits()):
   print(self.repo.git.show(commit.hexsha, name_only=True).split('\n'))
nicbou
  • 1,047
  • 11
  • 16
-5

I solved this problem for SCM Workbench. The important file is:

https://github.com/barry-scott/scm-workbench/blob/master/Source/Git/wb_git_project.py

Look at cmdCommitLogForFile() and its helper __addCommitChangeInformation().

The trick is to diff the tree objects.

Barry Scott
  • 799
  • 6
  • 13
  • 1
    StackOverflow highly discourages people from putting answers in linked pages. Linked pages often get moved or removed, then the answer is gone. – Craig S. Anderson Apr 27 '17 at 00:50
  • Can you please update your answer. I'm searching for the same and don't want to search this big file when you already have found the solution there. I want to get all files that are committed currently not all commits since the start of the repo. – muuvmuuv Oct 03 '18 at 12:38