Удалить файл из всех коммитов
Я загрузил файл шрифта, который я не имею права распространять на git hub несколько обновлений назад. У меня есть относительно неактивное хранилище, и я могу уведомить всех своих участников, если это необходимо. Я пробовал несколько решений. Мне нужно удалить файл в моем каталоге с именем Resources\Video\%font%.ttf
где %font%
это название простого, выделенного курсивом и жирного шрифта. Какие команды я использую?
6 ответов
В этом случае вы можете использовать команду Git Filter Branch с --tree-filter
вариант.
синтаксис git filter-branch --tree-filter <command> ...
git filter-branch --tree-filter 'rm -f Resources\Video\%font%.ttf' -- --all
Объяснение о команде:
<команда>: укажите любую команду оболочки.
--tree-filter: Git проверяет каждую фиксацию в рабочем каталоге, запускает вашу команду и повторно фиксирует.
--all: Фильтровать все коммиты во всех ветках.
Примечание. Пожалуйста, проверьте путь к файлу, так как я не уверен, что путь к файлу
Надеюсь, это поможет вам!
Согласно официальным документам git, используя
git filter-branch
настоятельно не рекомендуется , и рекомендуется использовать добавленную команду git-filter-repo .
Установите его (через пакет или пакет python3-pip, выполните установку pip ).
Приказ изгнания нечистой силы
filename
тогда :
git filter-repo --invert-paths --path filename
В
--invert-paths
параметр указывает исключить, а не включать следующие пути.
git filter-branch --index-filter 'git rm --cached --ignore-unmatch Resources\Video\%font%.ttf' HEAD
может быть намного (до 100 раз) быстрее, чем --tree-filter
потому что он обновляет только историю git, а не рабочий каталог.
ref: В чем разница между "--tree-filter" и "--index-filter" в "git filter-branch"?
ссылка: https://git-scm.com/docs/git-filter-branch
УДАЛЕНИЕ ФАЙЛА ИЗ ВСЕХ ЗАПИСЕЙ
git filter-branch --prune-empty --index-filter "git rm --cached -f --ignore-unmatch NAME_OF_FILE_YOU_WANT_TO_REMOVE" --tag-name-filter cat -- --all
УДАЛЕНИЕ ВСЕГО СПРАВОЧНИКА ИЗ ВСЕХ ЗАПИСЕЙ
git filter-branch --prune-empty --index-filter "git rm --cached -rf --ignore-unmatch NAME_OF_DIRECTORY_YOU_WANT_TO_REMOVE" --tag-name-filter cat -- --all
Вы можете проверить это, коммиты, включая файл, были изменены, и фиксация только с этим файлом удаляется из журнала. Проверить с помощью
gitk
или
git log
.
ОБЪЯСНЕНИЕ ИСПОЛЬЗУЕМЫХ ВАРИАНТОВ
--prune-empty
- удаляет коммиты, которые становятся пустыми (т. е. не изменяют дерево) в результате операции фильтрации. В типичном случае эта опция обеспечивает более чистую историю.
--index-filter
- главное событие и выполняется по индексу на каждом шаге в истории. Вы хотите удалить упс. iso везде, где он есть, но не во всех коммитах. Команда git rm --cached -f --ignore-unmatch oops.iso удаляет DVD-рип, если он присутствует, и не дает сбой в противном случае.
--tag-name-filter
- описывает, как переписывать имена тегов. Фильтр кота - это операция идентификации. В вашем репозитории, как и в приведенном выше примере, может не быть тегов, но я включил эту опцию для полной общности.
- указывает конец параметров для git filter-branch
--all
следующий
--
- сокращение для всех ссылок. В вашем репозитории, как и в примере выше, может быть только одна ссылка (master), но я включил эту опцию для полной общности.
-r
- рекурсивно удалить все в каталоге
Сделать резервную копию
Внутренний рабочий каталог
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch Resources\Video\%font%.ttf' --prune-empty --tag--name-filter cat -- --all
git push origin --all --force
Внутри Bare Repo
git gc --prune=now
Я пытался: удалить конфиденциальные данные и историю из репозитория и,
Пробуя вышеуказанное решение. Я нашел это видео на YouTube, оно сработало у меня: Со ссылкой на видео:
Команда: Нам нужно запустить эту команду из корневого каталога git и относительного пути пользователя к файлу в следующей команде.
$ git filter-branch --index-filter 'git rm --cache --ignore-unmatch /root-app/props/password.properties' HEAD
Выход:
$ git filter-branch --index-filter 'git rm --cache --ignore-unmatch ./root-app/props/password.properties' HEAD
Rewrite 7243bb0ad4f3aca3a35e2b5ca86926856e77b666 (14860/14864) (1011 seconds passed, remaining 0 predicted) rm 'root-app/props/password.properties'
Rewrite 36c00b1203edf35321c0a0204e2fcb6341a5436d (14860/14864) (1011 seconds passed, remaining 0 predicted) rm 'root-app/props/password.properties'
Rewrite d6bf5d98ec548113f47b9dc7b6dcecf357fdf8db (14860/14864) (1011 seconds passed, remaining 0 predicted) rm 'root-app/props/password.properties'
Я надеюсь, что это сработает и для других.