Прочесывание репозиториев git, сохранение истории и ссылок

У меня есть несколько репозиториев 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 (это должно привести все капли, деревья и коммиты 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
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Например: somme refs фактически хранятся в .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, и все будет близко к хорошему.


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

Конечно, я могу использовать reomte, как указано в ссылках в моих вопросах, и использовать скрипт для переименования каждой ветки / тега один за другим, а затем сделать то же самое для следующего пульта дистанционного управления. Однако мне это кажется громоздким. В чем может быть проблема, если я буду манипулировать .git так, как я думал выше?

Adrian Shum 26.10.2018 09:15

это просто: прохождение официального API (например, команд git) приведет к меньшему количеству ошибок, чем обратное проектирование реализации. Например: использование git clone / git fetch гарантирует, что git действительно перечисляет все ссылки (например, некоторые из них хранятся в packed-refs)

LeGEC 26.10.2018 09:20

(для вашего обновления) существование refs/remotes/foo бессмысленно, поскольку после того, как я опубликовал это репо для использования нашей командой, у них не будет таких же пультов, как у моего комбинированного. Я хочу сделать так, чтобы теги / ветки исходного репозитория были в новом комбинированном репозитории.

Adrian Shum 26.10.2018 09:20

Хороший аргумент для упакованных реф. Кажется, не удалось найти ярлык ... :( спасибо

Adrian Shum 26.10.2018 09:21

(Я искал достойный способ делать то, что вы хотите): используйте refspec для каждого пульта ДУ

LeGEC 26.10.2018 09:23

Спасибо, головы кажутся немного яснее с refspecs. Все еще не понимаю, как работать с тегами

Adrian Shum 26.10.2018 09:55

Вы пробовали использовать две строки refspec в моих последних правках?

LeGEC 26.10.2018 10:04

Позвольте нам продолжить обсуждение в чате.

LeGEC 26.10.2018 10:32

Работает ОТЛИЧНО! Потрясающие советы по использованию refspec таким образом, о котором я никогда не думал

Adrian Shum 26.10.2018 10:49

Другие вопросы по теме