Удалить файл из всех коммитов

Я загрузил файл шрифта, который я не имею права распространять на 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'

Я надеюсь, что это сработает и для других.

Другие вопросы по тегам