Расчесывание Git-репозиториев, сохранение истории и ссылок - PullRequest
0 голосов
/ 26 октября 2018

У меня есть несколько репозиториев Git, которые я хочу объединить в одно. Я нашел несколько статей в Интернете, например

Они получают графики коммитов разных репозиториев, выбирая их как удаленные.

Однако, глядя на шаги, кажется, что, хотя история коммитов сохраняется, ссылки не сохраняются.

Что я хочу, это:

  • Предположим, у меня есть 2 репо, foo и bar
  • Я хочу, чтобы их истории существовали в combined репо
  • В новом репо combined я хочу иметь возможность ссылаться на существующие ветви и теги в foo с foo/ в качестве суффикса. Так что если есть одинаковые теги v1.0 в foo и bar, он становится foo/v1.0 и bar/v1.0 в combined репо

Я думаю об этом и хотел бы уточнить у экспертов, чтобы убедиться, что он работает:

  1. Сделайте локально клонированные репо foo и bar с извлеченными тегами
  2. Создать новый combined репозиторий с начальной фиксацией
  3. Скопируйте foo и bar .git/objects в combined/.git/objects (Это должно привести ко всем BLOB-объектам, деревьям и коммитам foo и bar в combined, верно?)
  4. копия foo/.git/refs/remotes/origin/* в combined/.git/refs/heads/foo/*. Сделайте аналогичную вещь для foo/.git/refs/tags/*
  5. Повторите 4 для bar хранилище
  6. Скопируйте обновленные .git/refs и .git/logs/refs/heads (исключая .git/logs/refs/remote) обоих foo и bar в combined
  7. Слияние foo/master с master и перемещение всего на foo/
  8. Сделайте то же самое для bar

Мне кажется, что это сработает, но я беспокоюсь, что, возможно, пропустил что-то, что может испортить хранилище, поэтому я спрашиваю мнение здесь.

1 Ответ

0 голосов
/ 26 октября 2018

Использование пультов дистанционного управления и выполнение команд git помогут вам избежать ошибок, связанных с обратным проектированием.

Например: ссылки на Somme фактически хранятся в .git/packed-refs, и вы не должны забывать их учитывать.

(Теперь, когда эта точка обозначена, проблема в том, чтобы определить другие точки, которые мы не обрисовали в общих чертах;))


Вы можете отредактировать refspec foo пульта дистанционного управления (соответственно bar), например +refs/*:refs/foo/* (соответственно +refs/*:refs/bar/*),

или, скорее:

+refs/heads/*:refs/heads/foo/* # map foo branches to local branches named 'foo/*'
+refs/tags/*:refs/tags/foo/*   # map foo tags to local tags named 'foo/*'

затем просто запустите git fetch, и вы должны быть близки к хорошему.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...