2015-10-25 3 views
3

Я использовал GitHub instructions for scrubbing a file from the commit history, но удалил этот файл из моей системы. Это было удивительно для меня, потому что сама команда git rm --cached должна оставить файл незатронутым. Но это поведение также можно увидеть в обработанном примере на этой странице: попробуйте запустить ls до и после большой команды git filter-branch ....Удалить файл из Git history без удаления файла

Я использую Git 2.6.1.

Как удалить файл из истории фиксации без удаления самого файла? Очевидно, я мог бы сделать резервную копию (что я и сделал в моем случае), но это обходное решение, а не решение.

+1

Создание резервной копии - это решение. – Schwern

+0

Git - это прежде всего программа Unix. В Unix вы не интегрируете каждый сценарий в свой исполняемый файл. Вы делаете (надеюсь) небольшие отдельные программы, сотрудничающие для достижения вашей цели. – PSkocik

ответ

4

Когда git-filter-branch сделано, он проверяет новую ветвь ветви. Это обновит ваш рабочий каталог до чистого состояния. Файл, который вы хотели стереть из истории, был уничтожен. Резервирование заранее - это решение.

Если вы забыли создать резервную копию, вы все равно можете вернуть его обратно! Гит требует много времени, чтобы выбросить вещи, ваши первоначальные коммиты все еще там. После git-filter-branch появится ветвь с именем original/refs/heads/master (если вы отфильтровали мастер), который содержит оригинальные фиксации. Вы можете восстановить файл оттуда.

В общем, вы можете восстановить фильтры и переустановки с помощью git reflog. Это журнал всех изменений HEAD (т. Е. Вы выписываете или переустанавливаете или объединяете или фильтруете или ...). Например, после выполнения примера фильтра GitHub, git reflog является ...

abaabaf (HEAD -> master, origin/master, origin/HEAD) [email protected]{0}: filter-branch: rewrite 
8ef0c30 (refs/original/refs/remotes/origin/master, refs/original/refs/heads/master) [email protected]{1}: clone: 

я могу использовать 8ef0c30 или [email protected]{1} (то есть. Предыдущее место HEAD) или original/refs/remotes/origin/master или original/refs/heads/master, чтобы вернуться туда, где все было до того, как фильтр бежал.

+0

Спасибо за подробный ответ. Этот момент необходимо уточнить в руководстве, которое я задал в вопросе. – shadowtalker

4

Прежде всего:

(Это должно быть сказано.)

При использовании git filter-branch вы делаете историю переписывания в автоматизирован образом в соответствии с вашим собственным (возможно багги) спецификации. Таким образом, вы должны сделать резервную копию своего репо, прежде чем делать это, в любом случае или выполнить операцию на новом отдельном клоне вашего репо.

Почему файл также исчезает из вашей рабочей копии

git filter-branch применяет указанную команду для каждого применимый фиксации. Тем не менее, он не проверяет эти коммиты в вашей рабочей копии для этого. Вместо этого он проверяет их на .git-rewrite/ по умолчанию или на каталог, который вы указали с опцией -d. (См git filter-branch документацию, опция -d < каталог>.)

После переписано применимые фиксаций, Git проверяет полученную новую ветвь. Поскольку это переход от ветви с файлом (предварительно переписывающей версией этой ветви) к одному без файла (после переписывающей версии этой ветви), файл также удаляется из вашей рабочей копии.

Как вы можете сохранить файл

Ну, сделайте резервную копию.

(Обратите внимание, что тег или ветвь не будет адекватной резервной копии, если вы переписыванием всех ветвей и все тегов, как это сделано в примере в https://help.github.com/articles/remove-sensitive-data/.)

Как вы можете получить этот файл, если вы не сделали этого

См. Schwern's answer.

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