Я прочитал несколько различное 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.
..
Итак, я поднялся по дереву на верхний уровень и повторно запустил команду, и все заработало.
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