'How to find which files have not changed since commit?

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

git


Solution 1:[1]

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.

Solution 2:[2]

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~~

Solution 3:[3]

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.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 santervo
Solution 2 William Pursell
Solution 3