Bastes
Bastes

Reputation: 1148

Find commits that modify file names matching a pattern in a GIT repository

I'd like to find commits in my code base that add video files to throw them out. Is there a way to look for these files in git ?

For example let's say all videos have a filename ending with the extension .wmv ; I'd like to find all commits introducing these files and get rid of them with a fixup or something.

Any ideas ?

Upvotes: 64

Views: 23471

Answers (7)

knittl
knittl

Reputation: 265161

You can use git log with a pathspec:

git log --all -- '*.wmv'

This will get you all commits which make changes to .wmv files. Yes, this will descend into subdirectories too (and you have to surround your pathspec with single quotes to protect it from being expanded by your shell; otherwise the wildcard will not be passed to Git, but only the expanded list of file names).

If you are only interested in commit hashes (scripting etc.) use the git rev-list machinery directly:

git rev-list --all -- '*.wmv'

Under Windows, it might be required to use double quotes instead of single quotes around the pathspec, i.e. "*.wmv"

Upvotes: 68

wyattis
wyattis

Reputation: 1297

To just view the commit hashes and the relevant file names for each commit you can use:

git rev-list --all -- '*.wmv' $1 | while read x; do git diff-tree --name-only -r $x; done | grep -E '((\.wmv$)|(^[^\.]+$))'

This will print out the commit hash followed by any filenames that matching the search string.

Upvotes: 0

Eriko Morais
Eriko Morais

Reputation: 19

You can try this:

git log --follow *.wmv

this will list all commits (with hash) that modified wmv files.

Upvotes: 1

MikeW
MikeW

Reputation: 6102

This can work in gitk as well, using the View / New View / Enter files and directories to include, one per line box.

But note that you need a wildcard that covers the path section of the filename, or else nothing will show.

eg if you have had a file called backup-script.sh, with a varied life (!) appearing in different places in the file tree and you want to see all versions, then you must specify:

*/backup-script.sh

Upvotes: 0

filipos
filipos

Reputation: 675

If the goal is to remove the files from the repository (thus rewriting history), use the BFG Repo-Cleaner, e.g.:

bfg --delete-files '*.wmv' --private --no-blob-protection

If the files are relevant, you can keep them under version control using Git LFS. To migrate (also rewriting history), you do something such as:

git-lfs-migrate \
    -s original.git  \
    -d converted.git \
    -l https://user:[email protected]:8080 \
    '*.wmv'

To simply list or examine the commits, I refer to knittl's answer:

git rev-list --all -- '*.wmv'
git log --all -- '*.wmv'

Upvotes: 1

adl
adl

Reputation: 16034

If you want to remove these files from all your commits, consider rewriting the entire history with the filter-branch command. E.g.,

git filter-branch --index-filter 'git rm --cached --ignore-unmatch -r *.wml' HEAD

Upvotes: 8

sehe
sehe

Reputation: 392893

Yup, like mentioned, I think the thinko is that removing the commits that introduce them is not going to remove the blobs

See http://progit.org/book/ch9-7.html#removing_objects for an extensive treatment of the subject and examples

Upvotes: 0

Related Questions