Некоторое время назад я добавил информацию (файлы), которая должна быть приватной. Удаление из проекта не проблема, но мне также нужно удалить его из git
истории.
Я использую Git и Github (личный аккаунт).
Примечание. В этом потоке показано нечто похожее, но вот старый файл, который был добавлен в ветку функций, эта ветка была объединена с ветвью разработки и, наконец, объединена в главную, поскольку в этом случае было сделано много изменений. Так что это не одно и то же, и необходимо изменить историю и скрыть эти файлы в целях конфиденциальности.
git rebase
тогдаgit push -f
filter-branch
Описано в предлагаемом дубликате метод будет делать то , что вы хотите.git filter-branch
Ответы:
Я нашел этот ответ, и это помогло:
Нашел здесь https://myopswork.com/how-remove-files-completely-from-git-repository-history-47ed3e0c4c35
источник
.env
. Быстрое и точное решение.<previous_hash>..HEAD
и сэкономьте время.git push --force
Если вы недавно зафиксировали этот файл или этот файл был изменен за один или два коммита, я предлагаю вам использовать
rebase
иcherrypick
для удаления этого конкретного коммита.В противном случае придется переписывать всю историю.
Когда вы удовлетворены изменениями и должным образом убедились, что все в порядке, вам необходимо обновить все удаленные ветки -
Примечание. - Это сложная операция, и вы должны осознавать, что делаете. Сначала попробуйте сделать это в демонстрационном репозитории, чтобы увидеть, как это работает. Вы также должны сообщить об этом другим разработчикам, чтобы они не вносили никаких изменений в это время.
источник
--all
. Теперь он говорит, что все обновлено, когда я повторно запускаю push с обоими аргументами. И файл не удаляется из других веток. Что мне теперь делать?--tree-filter
а не--index-filter
как в ответе @PetroFranko?удалите файл и перезапишите историю из фиксации, которую вы сделали с удаленным файлом (это создаст новый хеш фиксации из файла, который вы зафиксировали):
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' --prune-empty --tag-name-filter cat -- --all
теперь принудительно нажмите репо:
git push origin --force --all
теперь скажите своим соавторам
rebase
.источник
Использование пакета bfg repo-cleaner - еще одна жизнеспособная альтернатива
git-filter-branch
. Судя по всему, тоже быстрее ...источник
.gitignore
файл и не забудьте зафиксировать файл :-)Вы можете использовать этот сайт: http://gtiignore.io, чтобы сгенерировать
.gitignore
для вас и добавить требуемый путь к вашим двоичным файлам / папкамПосле того, как вы добавили файл,
.gitignore
вы можете удалить «старый» двоичный файл с помощью BFG.How to remove big files from the repository
Можно использовать
git filter-branch
или BFG. https://rtyley.github.io/bfg-repo-cleaner/Примеры (с официального сайта)
источник
Я прочитал эту статью на GitHub , которая привела меня к следующей команде (похожей на принятый ответ, но немного более надежной):
источник
git-репо-фильтр
git
рекомендует использовать git-filter-repo (приgit filter-branch
выполнении команды). Существует длинный список того, почему он лучше любых других альтернатив ( https://github.com/newren/git-filter-repo#why-filter-repo-instead-of-other-alternatives ), мой опыт что это очень просто и очень быстро.Эта команда удаляет файл из всех коммитов во всех ветвях:
git filter-repo --path <path to the file or directory> --invert-paths
Можно указать несколько путей с помощью нескольких
--path
параметров. Вы можете найти подробную документацию здесь: https://www.mankier.com/1/git-filter-repoисточник