Git — удалить все файлы определенного типа из репозитория

Как удалить все файлы определенного типа из репозитория? я использую

git filter-branch --index-filter 'git rm -rf --cached **/*.jar'

Либо git не расширяет globs, либо не расширяет ** так, как я ожидаю.


person lmat - Reinstate Monica    schedule 10.08.2016    source источник
comment
Вы хотите удалить их из индекса или сформировать репозиторий? filter-branch очистит ваше репо   -  person CodeWizard    schedule 10.08.2016
comment
@CodeWizard Вы правы, я неправильно сформулировал вопрос!   -  person lmat - Reinstate Monica    schedule 23.03.2018


Ответы (5)


Вам просто нужно запустить это, чтобы удалить все ваши банки из индекса:

git rm -r --cached **/*.jar

Запустите эту команду из корневого каталога проекта, и она очистит и удалит все ваши файлы только из промежуточной области.

person CodeWizard    schedule 10.08.2016
comment
Что расширяет **? Bash (или какая-то другая оболочка) или git? Поскольку index-filter не проверяет код, расширение bash здесь бесполезно. - person lmat - Reinstate Monica; 11.08.2016
comment
Если я правильно понимаю, ** там не нужен, потому что в git * соответствует разделителям пути :-o. (см. pathspec под git help glossary.) - person lmat - Reinstate Monica; 12.08.2016

Самый простой способ, который я нашел, — использовать BFG Repo-Cleaner.

Инструкции на странице проекта понятны. Команда, которую вы бы использовали, выглядит примерно так:

bfg --delete-files "*.jar"  my-repo.git

BFG очистит историю репо от всех файлов, оканчивающихся на расширение .jar. Затем вы можете проверить результат, прежде чем отправить его обратно на сервер.

person JoshOfAllTrades    schedule 12.08.2016
comment
в папке .git размером 700G BFG barfs с org.eclipse.jgit.errors.LargeObjectException: baa7b692c1a57f577770b6eefab3e8eb16e10d54 превышает предельный размер - person zumalifeguard; 18.02.2020
comment
@zumalifeguard, ты пробовал это?: --massive-non-file-objects-sized-up-to <size> increase memory usage to handle over-size Commits, Tags, and Trees that are up to X in size (eg '10M') - person hoijui; 28.04.2020
comment
Может быть интересно, что bfg доступен для Mac через brew (brew install bfg) и для WinX через choco (choco install bfg-repo-cleaner). - person User51; 24.03.2021

git filter-branch --index-filter 'git rm -rf --cached **/*.jar'

должно работать, но это немного глупо, потому что git globs (*) соответствует разделителям путей. Итак, **/*.jar эквивалентно *.jar.

Это также означает, что */a*.jar соответствует dir1/abc/dir2/log4j.jar. Если вы хотите сопоставить что-то вроде **/a*.jar (все банки, чье имя начинается с a в любом каталоге), вы должны использовать find. Вот команда для удаления любых банок, имена которых начинаются с a или b, а также любых банок в dir1/dir2 и любого файла .txt в любом каталоге:

git filter-branch --index-filter 'git rm -rf --cached "*.txt" "dir1/dir2/*.jar" $(find -type f -name "a*.jar" -o -name "b*.jar")'

Ссылки: pathspec раздел git help glossary.

person lmat - Reinstate Monica    schedule 12.08.2016

В Git 2.24 (4 квартал 2019 г.) git filter-branch устарело.

Эквивалентным было бы использование newren/git-filter-repo и его пример раздела:

cd repo
git filter-repo --path-glob '*.jar' --invert-paths

Это удалит любой файл jar из истории репозитория.

person VonC    schedule 05.10.2019

Хотя это не команда git, но для тех, кто интересуется, как это сделать на Linux-машине, вы можете использовать

git ls-files | grep "\.sh$" | { while IFS= read -r line; do git rm --cached "$line"; done }

Здесь мы перечисляем все файлы в индексе git и передаем этот вывод команде grep для фильтрации только .sh файлов, а затем для каждого файла мы выполняем git rm --cached <file>.

person Viktor K    schedule 12.08.2016