6

In git, how can one find out which files in directory have NOT changed since some commit?

CharlesB
  • 86,532
  • 28
  • 194
  • 218
santervo
  • 534
  • 5
  • 8

3 Answers3

7

IMO a far easier way to generate your list would be the following command chain:

git ls-files --full-name | grep -v "$(git diff --name-only <REF>)"

Where <REF> is the hash of the commit from which you want the unchanged files since.


git ls-files list, as you could expect, all versioned files and then you grep all files which aren't in the list of changed files since the specified commit.

santervo
  • 534
  • 5
  • 8
Sascha Wolf
  • 18,810
  • 4
  • 51
  • 73
3

Use git diff --name-only $REV to get the list of files that have changed. Use git -C $(git rev-parse --show-toplevel) ls-tree -r HEAD --name-only to get the list of all files. Use grep to separate the sets:

git diff ${REV?must specify a REV} --name-only > /tmp/list
git -C $(git rev-parse --show-toplevel) ls-tree -r HEAD  --name-only |
     grep -f /tmp/list -v

Prior to executing those commands, you'll need to specify a rev in the variable REV. eg, REV=HEAD~6 or REV=branch-name~~

William Pursell
  • 204,365
  • 48
  • 270
  • 300
0

Note the suggested solutions treat file deletion after a commit as a change after it.

Also on a large git repo, the suggested one-liners did not work for me with the thrown error: grep: Argument list too long.

So, I had to work with files:

$ git ls-files --full-name | sort > all.git
$ git diff --name-only <REF> | sort > recent.change
$ comm -12 all.git recent > recent.change.not.deleted
$ comm -13 all.git recent.change.not.deleted

comm is a linux utility that shows common and unique lines in two files. Hopefully similar utilities exist for other platforms.

Ofek Shilon
  • 14,734
  • 5
  • 67
  • 101