Как создать информацию reflogs в существующем голом репозитории

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

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


person instcode    schedule 26.05.2011    source источник


Ответы (1)


reflog — это относительно простой формат файла. Вот пример:

] cat .git/logs/HEAD|sed 's/\t/<TAB>/'
0000000000000000000000000000000000000000 5cfe4256d98af22a570c78c5e3048391a90f5f98 Joe User <[email protected]> 1306427954 -0400<TAB>clone: from git://git.kernel.org/pub/scm/git/git.git

Вы можете вручную создать соответствующие журналы ссылок, следуя тому же формату:

previous-ref-or-zero new-ref User Name <user@email> unix-timestamp timezone\tmessage

Просто создайте один из них для каждой ссылки. Вероятно, вы можете сделать это напрямую с помощью git for-each-ref с соответствующей строкой формата (спасибо, Крис!)

person bdonlan    schedule 26.05.2011
comment
К сожалению, я только что попробовал, и это не работает. Вы можете попробовать сначала установить для core.logallrefupdates значение по умолчанию (отключить), затем создать голое репо и снова включить logallrefupdate и... - person instcode; 26.05.2011
comment
Программы, перебирающие ссылки, должны использовать git for-each-ref вместо того, чтобы «иметь дело как с свободными, так и с упакованными ссылками». - person Chris Johnsen; 27.05.2011
comment
В моем случае git pack-refs ничего не возвращает. Тем не менее, я нашел более простой способ — клонировать это репо, а затем скопировать .git/logs в голое репо. Ключом к решению этой проблемы является знание того, где хранятся журналы ссылок, которых я не знал :). Спасибо. - person instcode; 27.05.2011