Получение всего содержимого в repo2 - самая простая часть. Более важный вопрос заключается в том, насколько важно для вас (или других пользователей repo2), чтобы результирующая история была бесшовной.
Из repo2 вы можете добавить repo1 в качестве удаленного и извлечь историю.
$ cd path/to/repo2
$ git remote add old-history path/to/repo1
$ git fetch old-history
В упрощенном мире, где у каждого репо была только ветка master
, это дало бы вам что-то вроде
O -- x -- x -- x <--(old-history/master)
O2 -- x -- x <--(master)
, поэтому история есть и ее можно запрашивать, но у вас есть на go с вашего пути, чтобы увидеть это. (Если в каждом репо есть несколько веток, картина более сложная, но в основном такая же.)
Предполагая, что old-history/master
имеет коммит с тем же содержимым, что и O2
, вы можете использовать git replace
в отдельный клон, чтобы сделать историю более или менее цельной. (Вы всегда можете добавить такой коммит к old-history/master
, если его нет.) Есть некоторые причуды с git replace
, поэтому, если вы хотите go по этому маршруту, обратитесь к документации по https://git-scm.com/docs/git-replace
Вы также можете сделать переписывание истории, чтобы навсегда объединить историю. Это более крайняя мера и требует некоторой координации с любыми другими пользователями, которые совместно используют repo2
, но это решение «сделай один раз, и все готово» (в отличие от replace
, который затрагивает только один локальный клон).
Чтобы переписать историю, вы можете использовать --parent-filter
из git filter-branch
(см. https://git-scm.com/docs/git-filter-branch), или предположительно вы можете использовать git filter-repo
(хотя я не знаю много об этой команде). Есть предостережения, чтобы сделать переписывание любого вида. Вы можете найти в SO многочисленные прошлые обсуждения этой процедуры или обратиться к git документам для получения информации о перезаписи общих историй.