Я хотел бы поместить проект Git на GitHub, но он содержит определенные файлы с конфиденциальными данными (имена пользователей и пароли, например /config/deploy.rb для capistrano).
Я знаю, что могу добавить эти имена в .gitignore , но это не удалит их историю в Git.
Я также не хочу начинать все заново, удалив каталог /.git.
Есть ли способ удалить все следы определенного файла в вашей истории Git?
Ответы:
Для практических целей первое, о чем вы должны беспокоиться, это СМЕНА ВАШИХ ПАРОЛЕЙ! Из вашего вопроса не ясно, является ли ваш git-репозиторий полностью локальным или у вас еще есть удаленный репозиторий; если он удаленный и не защищен от других, у вас есть проблема. Если кто-то клонировал этот репозиторий до того, как вы это исправите, у него будет копия ваших паролей на их локальном компьютере, и вы не сможете заставить их обновиться до «фиксированной» версии, если она ушла из истории. Единственная надежная вещь, которую вы можете сделать, - это сменить пароль на другой, где бы вы его не использовали.
С этим из пути, вот как это исправить. GitHub ответил именно на этот вопрос в виде FAQ :
Примечание для пользователей Windows : используйте двойные кавычки (") вместо одинарных в этой команде
Обновление 2019:
Это текущий код из FAQ:
Имейте в виду, что как только вы отправили этот код в удаленное хранилище, такое как GitHub, и другие клонировали этот удаленный репозиторий, вы находитесь в ситуации, когда вы переписываете историю. Когда другие попытаются свернуть ваши последние изменения после этого, они получат сообщение о том, что изменения не могут быть применены, потому что это не ускоренная перемотка вперед.
Чтобы это исправить, им придется либо удалить свой существующий репозиторий и повторно клонировать его, либо следовать инструкциям в разделе «ВОССТАНОВЛЕНИЕ ОТ РЕБАЗЫ UPSTREAM» на странице руководства git-rebase .
Совет : выполнить
git rebase --interactive
В будущем, если вы случайно зафиксируете некоторые изменения с помощью конфиденциальной информации, но заметите, прежде чем отправлять их в удаленный репозиторий, есть некоторые более простые исправления. Если вы в последний раз добавили конфиденциальную информацию, вы можете просто удалить конфиденциальную информацию и запустить:
Это изменит предыдущий коммит с любыми внесенными вами новыми изменениями, включая удаление всего файла, сделанное с помощью
git rm
. Если изменения еще вернулись в историю, но все еще не перенесены в удаленный репозиторий, вы можете сделать интерактивное перебазирование:Откроется редактор с коммитами, которые вы сделали со времени вашего последнего общего предка с удаленным репозиторием. Измените «выбрать» на «редактировать» в любых строках, представляющих коммит с конфиденциальной информацией, и сохраните и выйдите. Git пройдет через изменения и оставит вас в месте, где вы можете:
Для каждого изменения с конфиденциальной информацией. В конце концов, вы вернетесь в свою ветку и сможете спокойно вносить новые изменения.
источник
filter-branch
кодом и страницей на github, на которую вы ссылаетесь, есть существенные различия . Например, их 3-я строка--prune-empty --tag-name-filter cat -- --all
. Изменилось ли решение или я что-то упустил?<introduction-revision-sha1>..HEAD
он не работает. Это только удаляет файл со второго коммита вперед. (Как мне включить начальный коммит в диапазон коммитов?) Здесь указан способ сохранения: help.github.com/articles/…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
Изменение ваших паролей - хорошая идея, но для процесса удаления паролей из истории вашего репо я рекомендую BFG Repo-Cleaner , более быструю и простую альтернативу
git-filter-branch
явным образом предназначенным для удаления личных данных из репозиториев Git.Создайте
private.txt
файл со списком паролей и т. Д., Который вы хотите удалить (по одной записи в строке), а затем выполните следующую команду:Все файлы с пороговым размером (по умолчанию 1 МБ) в истории вашего репо будут отсканированы, и любая подходящая строка (которой нет в вашем последнем коммите) будет заменена строкой «*** REMOVED ***». Затем вы можете использовать
git gc
для очистки мертвых данных:BFG обычно в 10-50 раз быстрее, чем работает,
git-filter-branch
и варианты упрощены и адаптированы к этим двум распространенным сценариям использования:Полное раскрытие: я являюсь автором BFG Repo-Cleaner.
источник
git commit
. В противном случае +1 за новый инструмент в наборе инструментов разработчика :)These are your protected commits, and so their contents will NOT be altered
, просматривая и редактируя остальную часть вашей истории коммитов. Однако, если вам необходимо выполнить откат, то да, вам нужно просто выполнить поиск***REMOVED***
в коммите, на который вы только что откатились.Если вы нажали на GitHub, принудительное нажатие недостаточно, удалите репозиторий или обратитесь в службу поддержки
Даже если после этого вы нажмете одну секунду, этого недостаточно, как описано ниже.
Единственными действительными способами действий являются:
Что такое утечка изменяемых учетных данных, как пароль?
нет (голые фото):
Вас волнует, если все проблемы в хранилище будут уничтожены?
да:
Силового толчка через секунду недостаточно, потому что:
GitHub хранит свисающие коммиты в течение долгого времени.
Персонал GitHub имеет право удалять такие висячие коммиты, если вы связываетесь с ними.
Я испытал это на собственном опыте, когда я загрузил все электронные письма о коммитах GitHub в репозиторий, они попросили меня снять его, так что я сделал, и они сделали
gc
. Однако запросы на извлечение, содержащие данные, должны быть удалены : эти данные репо оставались доступными в течение одного года после первоначального удаления из-за этого.Оборванные коммиты можно увидеть через:
Один из удобных способов получить исходный код для этого коммита - использовать метод download zip, который может принимать любые ссылки, например: https://github.com/cirosantilli/myrepo/archive/SHA.zip
Получить недостающие SHA можно либо:
type": "PushEvent"
. Например, мой: https://api.github.com/users/cirosantilli/events/public ( Wayback machine )Есть такие утилиты, как http://ghtorrent.org/ и https://www.githubarchive.org/, которые регулярно объединяют данные GitHub и хранят их в другом месте.
Я не мог найти, очищают ли они фактическую разницу коммитов, и это маловероятно, потому что данных было бы слишком много, но это технически возможно, и у АНБ и его друзей, вероятно, есть фильтры для архивирования только тех вещей, которые связаны с людьми или коммитами интересов.
Однако если вы удаляете репозиторий вместо принудительного нажатия, коммиты немедленно исчезают даже из API и дают 404, например, https://api.github.com/repos/cirosantilli/test-dangling-delete/commits/8c08448b5fbf0f891696819f3b2b2d653f7a3824 Это работает даже если вы воссоздаете другой репозиторий с тем же именем.
Чтобы проверить это, я создал репо: https://github.com/cirosantilli/test-dangling и сделал:
Смотрите также: Как удалить оборванный коммит из GitHub?
источник
Я рекомендую этот сценарий Дэвида Андерхилла, который для меня сработал.
Он добавляет эти команды в дополнение к ветке-фильтру natacado, чтобы убрать беспорядок, который он оставляет:
Полный сценарий (вся заслуга Дэвида Андерхилла)
Последние две команды могут работать лучше, если их изменить на следующее:
источник
git gc --aggressive --prune=now
Чтобы было понятно: принятый ответ правильный. Попробуйте сначала. Однако это может быть излишне сложно для некоторых случаев использования, особенно если вы сталкиваетесь с неприятными ошибками, такими как «fatal: bad revision --prune-empty», или действительно не заботитесь об истории вашего репо.
Альтернативой будет:
Это, конечно, удалит все ветки истории коммитов и проблемы как из вашего репозитория github, так и из вашего локального репозитория git. Если это неприемлемо, вам придется использовать альтернативный подход.
Назовите это ядерным вариантом.
источник
Вы можете использовать
git forget-blob
.Использование довольно просто
git forget-blob file-to-forget
. Вы можете получить больше информации здесьhttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Он исчезнет из всех коммитов в вашей истории, рефлогов, тэгов и т. Д.
Время от времени я сталкиваюсь с одной и той же проблемой, и каждый раз, когда мне приходится возвращаться к этому и другим постам, я автоматизировал этот процесс.
Кредиты авторам из Stack Overflow, которые позволили мне собрать это воедино
источник
Вот мое решение в Windows
убедитесь, что путь правильный, иначе он не будет работать
Я надеюсь, что это помогает
источник
Используйте фильтр-ветку :
источник
Я должен был сделать это несколько раз на сегодняшний день. Обратите внимание, что это работает только для 1 файла за раз.
Получить список всех коммитов, которые изменили файл. Внизу будет первый коммит:
git log --pretty=oneline --branches -- pathToFile
Чтобы удалить файл из истории, используйте первый коммит sha1 и путь к файлу из предыдущей команды и введите их в эту команду:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <path-to-file>' -- <sha1-where-the-file-was-first-added>..
источник
Итак, это выглядит примерно так:
источник
В моем проекте Android у меня был admob_keys.xml в виде отдельного XML-файла в папке app / src / main / res / values / . Для удаления этого секретного файла я использовал приведенный ниже скрипт и работал отлично.
источник