Intereting Posts
Настройка непрерывной интеграции в App Engine Как отключить это раздражающее выполнение комментариев по git Что делает код Reformat при нажатии Git в PhpStorm и где его устанавливать? Eclipse (плагин для дизайнера webMethods) EGit и BitBucket – отслеживание изменений `git status` утверждает, что рабочее дерево должно быть чистым (= без измененных файлов), все еще` git add * `добавляет два каталога Какова хорошая стратегия для сохранения старых версий пакета R на GitHub? SVN получает последнее сообщение фиксации в автономном режиме Проблема с командой svn copy msysGit un-install runtime error 18: 1292 невозможно вызвать proc Защитите файл от изменений в git merge Зафиксировать выбранные файлы для git и перейти на битбакет Как настроить DNS для указания страниц проекта github? Github – текущая ветвь не настроена для вытягивания. Нет значения для key branch.master.merge, найденного в конфигурации Каков наилучший способ настройки среды разработки и производства для приложения PHP / MySQL? Eclipse Maven – Неразрешимое расширение сборки

Удалите файл из истории Git, не удаляя файл

Я использовал инструкции GitHub для очистки файла из истории фиксации , но он удалил этот файл из моей системы. Это было удивительно для меня, потому что git rm --cached команда git rm --cached сама должна оставить файл незатронутым. Но это поведение также можно увидеть в обработанном примере на этой странице: попробуйте запустить ls до и после команды git filter-branch ...

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

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

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

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

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

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

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

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

(Это нужно сказать.)

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

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

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

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

Как сохранить файл

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

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

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

См . Ответ Шверна .