Как восстановить refs / original / refs / heads / tmp? - PullRequest
0 голосов
/ 18 марта 2012

Дерево фильтров Git хранит резервную копию в .git/refs/original/refs/heads/tmp.Но я не могу найти какие-либо инструкции о том, как восстановить из него.С тех пор я не трогал хранилище - я просто передумал относительно мудрости этой конкретной манипуляции.

Я предполагаю, что ответ - либо копия файла, либо git update-ref, но это довольно разрушительнооперации, и я не хочу, чтобы это неправильно.

1 Ответ

0 голосов
/ 18 марта 2012

Вот что нужно знать, из чего все остальное вытекает: кроме случаев, когда git gc (ну, и вещи git gc тоже), git никогда ничего не удаляет , только когда-либо добавляет новые вещи .

Допустим, у вас есть ветка, которая выглядит примерно так:

* 9d2e82c handle another temporary failure mode
| * 2afb8a0 (resubmit) checkpoint: resubmit
| * 90dcfbb move definitinon of GRONK to sysdefs
|/  
* 1ba7847 treat XML login errors as temporary failures

(это отрезанный и слегка измененный вывод из git lola: http://blog.kfish.org/2010/04/git-lola.html). Теперь скажите, что я сделал что-то с моей «повторной» веткой, например, неправильный filter-branch, так что у меня есть две новые фиксации в этой ветке (1234567 и 7654321 или что-то еще). Я понимаю, о нет, я сделалчто-то полностью сломано, и я хочу, чтобы «resubmit» вернулся к указанию на коммит 2afb8a0, который является исходной подсказкой этой ветви.

Этот коммит все еще находится в git , и будетпо крайней мере на несколько месяцев (дольше, потому что у вас есть видимое пользователем имя ветки original/refs/heads/tmp - попробуйте, например, git log, вы увидите, что оно там). Найдите идентификатор фиксации - в вашем случае это простос именем original/refs/heads/tmp - и сделайте там свою точку ветвления.у вас не было имени, вы могли бы сделать git branch -d resubmit, а затем git branch resubmit 2afb8a0 (для моего собственного примера выше), но вы делаете, поэтому:

git branch -D tmp
git branch -m original/refs/heads/tmp tmp

удалит ваш текущий tmp ипереименуйте переименованный обратно в tmp.

(Недавно добавлены новые коммиты filter-branch, которые, как вы решили, вам не нравятся, все равно будут в вашем хранилище.Как только вы удалите видимые для пользователя имена, срок их действия истечет через 3 месяца, после чего git gc удалит их.)

...