2015-08-24 6 views
5

Я случайно совершил что-то, что может быть чувствительной информацией в git (только локально), и я хочу удалить его из истории git простым способом. Будет лиgit reset удалить историю?

git reset --soft HEAD~1 

, а затем убрать из буфера с информацией и чувствительной добавить в gitignore быть достаточно, чтобы полностью удалить его из истории мерзавца?

ответ

4

Нет, мягкого сброса недостаточно. Выполнение этого будет оставить файл в вашем индексе (где вы ставите файлы, которые необходимо совершить). Это означает, что git все еще отслеживает файл.

Вам понадобится выполнить смешанный сброс, который также отключит эти файлы. Как отметил Рене, также рекомендуется удалить файл или добавить его в ваш .gitignore, чтобы вы не случайно его снова приняли.

Этого достаточно, поэтому конфиденциальная информация не будет передаваться на удаленный сервер по адресу git push.

Однако информация по-прежнему находится в вашем локальном репозитории. Если вы когда-либо «потеряли» фиксацию, случайно сбросив слишком далеко, git reflog - очень полезный инструмент.

Теперь, чтобы очистить все от всех фиксаций, которые не доступны через ответвления или метки:

git reflog expire --expire=1.minute --all 
git prune 
git gc 
  1. Удаляет все записи старше 1 минута от reflog. Конец не удаляется, если есть какая-либо ссылка на него. Такая ссылка может исходить от другой фиксации, ветви, тега, а также reflog.
  2. Удаляет все коммиты, которые недоступны.
  3. Выполняет ряд хозяйственных задач. Для получения дополнительной информации смотрите на documentation

reflog expire и prune деструктивные операции. Я рекомендую сначала запустить эти команды с аргументом --dry-run, чтобы узнать, что именно удаляется.

2

Нет необходимости в --soft: git reset HEAD~1 будет отключать текущие файлы фиксации путем сброса индекса в дополнение к перемещению HEAD.

Тогда .gitignore будет достаточно, чтобы игнорировать этот файл.

Возможно, вы должны сделать git reset --soft HEAD~1, а затем git reset HEAD <file>?

Нет, вам необходимо удалить все фиксации, чтобы убедиться, что история не будет содержать ваш конфиденциальный файл.

git reset HEAD~1 
echo sensitiveFile >> .gitignore 
git add .gitignore 
git add -A . 
git commit -m "Redo commit, without sensitiveFile" 
+0

Почему мой пример недостаточно? git reset HEAD удаляет файл из истории, не так ли? Разве этого недостаточно? – Mattias

+0

@Mattias 'git reset HEAD - ' только перезагружает файл, но не изменяет текущую фиксацию (которая по-прежнему включает ваш конфиденциальный файл). Вы могли бы совершить новую фиксацию без вашего файла, но история (предыдущая фиксация) все равно будет ссылаться на чувствительный файл. Чтобы действительно удалить его из истории, вам нужно повторить предыдущую фиксацию, а не только файл. – VonC

+0

Если я сделаю 'git reset --soft HEAD ~ 1', который сбрасывается на предыдущий фиксатор (тот, который был до того, как был запущен файл с чувством), а затем выполните сброс git HEAD - ', который удалит чувствительную файл из индекса git, не получится ли я получить тот же результат, что и при выполнении 'git reset HEAD ~ 1', за исключением того, что я сохраняю все нечувствительные файлы в индексе? – Mattias

2

git reset --soft HEAD~1 сбрасывает только HEAD в предыдущий коммит в то время как индекс и рабочий каталог не трогали.

Это означает, что индекс и рабочий каталог все еще отражает состояние, содержащее конфиденциальную информацию. Просто удалите эти файлы из индекса git reset HEAD <file>... и совершите еще раз.

После удаления конфиденциальных файлов данных из индекса они останутся в рабочем каталоге. Возможно, вы также захотите удалить их из рабочего каталога или добавить их в .gitignore.

EDIT

Вы хотите сказать, я должен сначала сделать мерзавец сброса --Мягкая ГОЛОВУ ~ 1, а затем GIT ГОЛОВУ сброса?

Да. Обычно вы создаете файлы git add .., а затем фиксируете их. Если вы делаете git reset --soft HEAD~1, ваш репозиторий отражает состояние перед этим фиксацией. Вы можете увидеть это, если вы делаете git status. Таким образом, вы можете изменить индекс и снова зафиксировать.

Кроме того, удаляет ли данные данные на 100% из истории git?

Нет, не полностью. Если фиксация больше не указана, git удалит ее после 90 дней (значение по умолчанию - см. git gc). Если вы хотите удалить его немедленно, вы должны убедиться, что он больше не ссылается. Поэтому вы должны удалить его из любого содержащего его reflog, например. git reflog --delete [email protected]{3}. Обычно он будет содержаться в блоке HEAD и вашей ветке. Также убедитесь, что он не содержится ни в одной ветви, например. если фиксация if равна A, выполните git branch -a --contains A. Выход должен быть пустым.

Затем вы можете сбрасывать мусор, используя git gc --prune=now. Убедитесь, что фиксация была удалена с использованием git log -n1 COMMIT-ID. Он должен вывести fatal: bad object.

Подробнее об удалении файлов и руководств от git см. В моем блоге https://www.link-intersystems.com/blog/2014/07/17/remove-directories-and-files-permanently-from-git/.

+0

Вы имеете в виду, что я должен сначала выполнить git reset --soft HEAD ~ 1, а затем git reset HEAD ? Кроме того, удаляет ли данные данные на 100% из истории git? Просто хочу убедиться. – Mattias

Смежные вопросы