Как удалить все файлы определенного типа из репозитория? я использую
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
Либо git не расширяет globs, либо не расширяет **
так, как я ожидаю.
Как удалить все файлы определенного типа из репозитория? я использую
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
Либо git не расширяет globs, либо не расширяет **
так, как я ожидаю.
Вам просто нужно запустить это, чтобы удалить все ваши банки из индекса:
git rm -r --cached **/*.jar
Запустите эту команду из корневого каталога проекта, и она очистит и удалит все ваши файлы только из промежуточной области.
**
? Bash (или какая-то другая оболочка) или git? Поскольку index-filter
не проверяет код, расширение bash здесь бесполезно.
- person lmat - Reinstate Monica; 11.08.2016
**
там не нужен, потому что в 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. Затем вы можете проверить результат, прежде чем отправить его обратно на сервер.
--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
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
.
В Git 2.24 (4 квартал 2019 г.) git filter-branch
устарело.
Эквивалентным было бы использование newren/git-filter-repo
и его пример раздела:
cd repo
git filter-repo --path-glob '*.jar' --invert-paths
Это удалит любой файл jar из истории репозитория.
Хотя это не команда 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>
.