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