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

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

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

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

4 ответа

Решение
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'

должно работать, но это немного глупо, потому что мерзавцы (*) соответствуют разделителям пути. Так, **/*.jar эквивалентно *.jar,

Это также означает, что */a*.jar Матчи dir1/abc/dir2/log4j.jar, Если вы хотите соответствовать что-то вроде **/a*.jar (все банки, название которых начинается с a в любом каталоге), вы должны использовать найти. Вот команда, чтобы удалить все банки, чьи имена начинаются с 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,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам