рекурсивно удалить все двоичные файлы из репозитория git и историю коммитов

Я прочитал несколько различное threads при удалении больших двоичных файлов из истории коммитов git, но моя проблема немного отличается. Отсюда мой вопрос здесь, чтобы понять и подтвердить шаги -

Мой репозиторий git - ~/foo. Я хочу удалить все файлы *.jpg, *.png, *.mp4, *.ogv (и т. д.) из одного из каталогов внутри репозитория, а именно из ~/foo/public/data.

Шаг 1. Удалите файлы

~/foo/data > find -E . -regex ".*\.(jpg|png|mp4|m4v|ogv|webm)" \
    -exec git filter-branch --force --index-filter \
    'git rm --cached --ignore-unmatch {}' \
    --prune-empty --tag-name-filter cat -- --all \;

Шаг 2. Добавьте расширения бинарных файлов в .gitignore и зафиксируйте .gitignore.

~/foo/data > cd ..
~/foo > git add .gitignore
~/foo > git commit -m "added binary files to .gitignore"

Шаг 3. Нажмите все

~/foo > git push origin master --force

Я на правильном пути выше? Я хочу дважды отмерить, прежде чем один раз отрезать, так сказать.

Обновление: Что ж, приведенное выше выдает мне ошибку

You need to run this command from the toplevel of the working tree.
You need to run this command from the toplevel of the working tree.
..

Итак, я поднялся по дереву на верхний уровень и повторно запустил команду, и все заработало.


person punkish    schedule 02.07.2013    source источник
comment
Я собирался использовать этот метод с find, но он повторно запускает filter-branch при каждой фиксации и ветке для каждого файла. В моем случае это было бы более 16 000 раз! Что сработало для меня, так это git rm -r и просто указание имени каталога, содержащего файлы-нарушители... git filter-branch --force --prune-empty --index-filter 'git rm -r --cached --ignore-unmatch path/to/image/files' -d /cygdrive/r/git-rewrite_`date +"%Y%m%d_%H%M%S%z"` --tag-name-filter cat -- --all   -  person Vince    schedule 04.06.2014
comment
Спасибо, это сработало как шарм для меня.   -  person Tobias    schedule 18.10.2019
comment
Я обновил свой ответ 2013 года с помощью инструмента 2020 года.   -  person VonC    schedule 09.07.2020


Ответы (1)


Процесс кажется правильным.

Вы также можете протестировать процесс очистки с помощью инструмента, такого как bfg repo cleaner, например этот ответ:

java -jar bfg.jar --delete-files *.{jpg,png,mp4,m4v,ogv,webm} ${bare-repo-dir};

(За исключением того, что BFG гарантирует, что он ничего не удалит в вашем последнем коммите, поэтому вам нужно удалить эти файлы в текущем индексе и сделать чистую фиксацию. Все другие предыдущие коммиты будут очищены BFG)

Обновление 2020: для удаления файлов теперь нужно использовать git filter-repo (Git 2.22+, Q4 2019), поскольку git filter-branch или BFG сейчас, 7 лет спустя, устарели.

git filter-repo --path fileToRemove --invert-paths
person VonC    schedule 02.07.2013
comment
BFG, вероятно, является хорошим инструментом для этой работы (отказ от ответственности: я создатель BFG). сценарий на шаге 1 (а не «тестировать»). Однако BFG действует во всем репо и в настоящее время не может быть ограничен одним путем к папке, например ~/foo/public/data. Если файлов с такими расширениями больше нет в репозитории, это не проблема. В качестве альтернативы, если они действительно существуют, но находятся в защищенных коммитах (например, ваш коммит HEAD), они также не будут удалены. - person Roberto Tyley; 02.07.2013
comment
@RobertoTyley спасибо за ваш комментарий и за BFG :) Отличный инструмент. - person VonC; 02.07.2013
comment
Добро пожаловать — приятно слышать о людях, использующих The BFG! - person Roberto Tyley; 02.07.2013
comment
Разве это не должно быть git filter-repo --path fileToRemove --invert-paths? - person Michel Jung; 30.10.2020
comment
@MichelJung Спасибо. Это была опечатка. Я отредактировал ответ соответственно. - person VonC; 30.10.2020