2016-11-21 6 views
5

Я перешел из SVN в git, и у меня была записка в каждой git-фиксации, ссылающейся на номер версии SVN. После импорта репо я использовал очиститель репозитория BFG для очистки истории git от двоичных файлов и других мусора. К сожалению, сейчас я не вижу заметок, когда я печатаю git log. Я полагаю, BFG забывает обновлять ссылки на коммиты для заметок. BFG оставляет * .txt отчет с отображением старого объекта идентификатор на новый идентификатор объекта, в следующем формате:примечания git после BFG?

0001b24011381e8885683cd1119ba4cb077fa64b c81149b1b52b9e1e1767d6141f292891d715edb5 
00024eecdc31f2f6e67018f7d6f00e7c1ad03f1f 326ee3b508e3dd2934ec1f50069195f86ea1a1c7 
00028e04dcc2d59bd835b447bd3a207ae481696c 3d18e9b9d3336e59d62093200b81603ffefcc747 

Можете ли вы предложить какой-то сценарий, чтобы быстро исправить ноты с учетом приведенных выше отображение?

PS: Я почти уверен, что проблема вызвана не обновленные рефами, потому что, когда я тип git notes на втором месте я могу видеть реф, которые считаются старым в BFG пересаживать object-id-map.old-new.txt

+0

«SVN to git» ✅, Какую команду вы используете с BFG? У BFG не так много вариантов, потому что цель проста. Если вы хотите создать чистый репозиторий, возможно, вам нужно создать только один коммит последней версии. Если ваш проект не имеет большой истории или если вы единственный, кто работает над этим. Это не проблема. [this] (http://stackoverflow.com/questions/1186535/how-to-modify-a-specified-commit-in-git) сообщение может помочь вам, если вы хотите изменить свою фиксацию. – Stargateur

+0

@ Начальник это огромное старое репо. Я использовал 'java -jar bfg-1.12.14.jar -D" *. {Jar, war, zip, dll, pdb} "--delete-folders" Spring "' – Derp

ответ

1

Я написал следующий Баш скрипт передать мои заметки из старых объектов.Решение медленное в одном потоке, но не уверен, что безопасно запускать несколько команд git notes параллельно.

while read string; do 
    hashesArray=($string) 
    git notes copy ${hashesArray[0]} ${hashesArray[1]} 
    git notes remove --ignore-missing ${hashesArray[0]} 
done <object-id-map.old-new.txt 
0

Там нет ничего построено, чтобы сделать это ; вам придется писать сценарий или программу самостоятельно. С яркой стороны BFG оставил вам файл карты: это намного лучше, чем git filter-branch, что отбрасывает его, так что информация, необходимая для обновления заметок, исчезла.

Базовая реализация в примечаниях, что refs/notes/commits (или как вы установите для core.notesRef) указует на обычное обязательство, что вы можете, по крайней мере в теории git checkout (вероятно, во временное рабочем дерево вы создали специально для этой цели). Это дерево содержит файлы, имена которых являются аннотированными коммитами, только слегка измененными. Например, если:

0001b24011381e8885683cd1119ba4cb077fa64b c81149b1b52b9e1e1767d6141f292891d715edb5 

является запись отображения, с 0001b24011381e8885683cd1119ba4cb077fa64b будучи старой фиксации, и если 0001b24011381e8885683cd1119ba4cb077fa64b имеет запись заметок, будет файл, чье имя является 0001b24011381e8885683cd1119ba4cb077fa64b -только, это может быть 00/01b2... или 00/01/b2....

глубина вложенности всех этих добавленных подкаталогов управляется динамически кодом нот, с общей идеей является «добавить столько деревьев, сколько необходимо для создания найти ли есть примечание, быстро, но не так много деревьев чтобы заняться большим пространством в хранилище, когда осталось очень мало заметок, начиная с 0001b2.... Этот разветвитель не имеет решающего значения для ваших целей, хотя вы можете сохранить его по тем же причинам скорости.

Ваша работа будет искать каждый файл в этом дереве под своим старым именем и переместить (или скопировать) его на новое имя, соответствующее новому значению commi t ID. Поскольку новое имя в этом случае будет c81149b1b52b9e1e1767d6141f292891d715edb5, вы бы переименовали файл как c8/1149b1b52b9e1e1767d6141f292891d715edb5 или c8/11/49b1b52b9e1e1767d6141f292891d715edb5 и т. Д. После того, как вы переименовали все файлы (с помощью индекса: используйте git mv или git rm --cached и git add при необходимости), вы можете повернуть их в обычный объект фиксации с git write-tree, а затем git commit-tree. Сделайте родителем нового коммита существующим refs/notes/commits commit и используйте git update-ref для обновления refs/notes/commits, чтобы указать на новый, и ваши заметки должны появиться после фильтрации.

(После того, как у вас есть такая вещь работает, было бы неплохо, чтобы присоединиться к нему с git filter-branch и/или самого BFG.)

+0

Спасибо, но это выглядит слишком сложно, я написал простой скрипт, который использует 'git notes copy' – Derp

+0

' git notes copy' делает выше (ну ... как * копия *, а не движение), но одно примечание за раз (отсюда медленность). Наверное, хорошо для вашего дела. – torek

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