Найти коммиты, которые изменяют имена файлов, соответствующие шаблону в репозитории GIT
Я хотел бы найти коммиты в моей базе кода, которые добавляют видеофайлы, чтобы выкинуть их.
Есть ли способ поиска этих файлов в git?
Например, пусть все видео имеют имя файла, заканчивающееся расширением .wmv; Я бы хотел найти все коммиты, представляющие эти файлы, и избавиться от них с помощью исправления или чего-то еще.
Любые идеи?
Ответы
Ответ 1
вы можете использовать git log
с помощью pathspec:
git log --all -- '*.wmv'
это даст вам все коммиты, которые вносят изменения в .wmv файлы. да, это тоже спустится в подкаталоги (но вам нужно окружить свой путь спецификацией одинарными кавычками, поэтому он будет передан как есть в git).
если вас интересуют только хэши фиксации (скрипты и т.д.), используйте непосредственно git rev-list
:
git rev-list --all -- '*.wmv'
Ответ 2
Если вы хотите удалить эти файлы из всех своих коммитов, рассмотрите возможность перезаписи всей истории с помощью команды filter-branch
. Например.
git filter-branch --index-filter 'git rm --cached --ignore-unmatch -r *.wml' HEAD
Ответ 3
Вы можете попробовать следующее:
git log --follow *.wmv
в этом списке будут перечислены все коммиты (с хешем), которые модифицировали wmv файлы.
Ответ 4
Yup, как уже упоминалось, я думаю, что мышление заключается в том, что удаление коммитов, которые их вводят, не будет удалять blobs
См. http://progit.org/book/ch9-7.html#removing_objects для подробного изучения предмета и примеров
Ответ 5
Если целью является удаление файлов из репозитория (таким образом, переписывание истории), используйте BFG Repo-Cleaner, например:
bfg --delete-files '*.wmv' --private --no-blob-protection
Если файлы имеют значение, вы можете сохранить их под контролем версий, используя Git LFS. Чтобы migrate (также переписывая историю), вы делаете что-то вроде:
git-lfs-migrate \
-s original.git \
-d converted.git \
-l https://user:[email protected]:8080 \
'*.wmv'
Чтобы просто перечислить или изучить коммиты, я ссылаюсь на ответ knittl:
git rev-list --all -- '*.wmv'
git log --all -- '*.wmv'
Ответ 6
Это может работать и в gitk, используя View/New View/Enter файлы и каталоги для включения, по одному в строке.
Но обратите внимание, что вам нужен шаблон, который охватывает раздел пути имени файла, иначе ничего не будет показано.
например, если у вас есть файл под названием backup- script.sh, с разнообразной жизнью (!), появляющейся в разных местах в дереве файлов, и вы хотите увидеть все версии, тогда вы должны указать:
*/backup-script.sh
Ответ 7
Чтобы просто просмотреть хеши коммитов и соответствующие имена файлов для каждого коммита, вы можете использовать:
git rev-list --all -- '*.wmv' $1 | while read x; do git diff-tree --name-only -r $x; done | grep -E '((\.wmv$)|(^[^\.]+$))'
Это напечатает хеш коммита, за которым следуют любые имена файлов, соответствующие строке поиска.