Слияние двух подобных удаленных репозиторий git в один

Я выполнил некоторые поиски и прочитал книгу git и некоторые места в Интернете, например, git, но я не могу найти правильный способ сделать это.

У меня есть два репозитория git, которые размещаются на двух разных машинах. Каждая из этих резервных копий git содержит конфигурацию для программы. Когда вы сравниваете два репозитория, некоторые части конфигурации идентичны, а некоторые - нет.

Мы хотим создать третий репозиторий и объединить содержимое двух других репозиториев в новый. Я надеюсь достичь этого, чтобы иметь один репозиторий, который имеет все данные из двух других репозиториев, но имеет только одну копию. Таким образом, мы надеемся, что git расскажет нам, что отличается между двумя репозиториями и объединить эти изменения в единое целое.

Надеюсь, это достаточно легко понять.

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

В первом примере просто сказано удалить все файлы и добавить кучу новых файлов. Это не то, что мы хотели, мы хотели, чтобы один репозиторий git содержал одну копию конфигурации, созданную в результате объединения двух удаленных репозиториев.

Если кто-то может помочь с этой проблемой, это будет очень признательно.

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

Ответы

Ответ 1

Если предположить, что репозиции называются A и B, вы можете начать с клонирования либо A, либо B в C:

$ git clone git://path/to/A.git

Теперь C идентично A (и A - начало C). Теперь мы можем добавить B в качестве пульта дистанционного управления к C и создать мастер-ветку отслеживания B, который отслеживает основную ветвь B:

$ git remote add B git://another/path/to/B.git
$ git fetch B
$ git checkout --track masterB B/master

Теперь главная ветвь C такая же, как ведущая ветвь A и ветки masterB такая же, как и master на B. Теперь мы можем объединить masterB в master:

$ git checkout master
$ git merge masterB
$ .. solve conflicts

Если вам не нужно отслеживать оригинальные репозитории, мы можем очистить их с помощью:

$ git remote rm origin
$ git remote rm B
$ git branch -d masterB

Ответ 2

У вас будет две разные ветки, исходящие из обоих репозиториев. Пусть говорят, что они

repo1/master
repo2/master

Я бы в этот момент просто объединил их и разрешил конфликты, чтобы он представлял собой один из репозиториев. Я бы снова сделал слияние, и на этот раз выберем другое репо в качестве мастера в случае любых конфликтов. Теперь у вас будет:

common1
common2

ветки. Объедините common2 в common1 с "нашей" стратегией. Теперь сделайте то же самое с другим. Это запомнит общую точку в истории и сохранит конфигурацию diff от предоставления вам проблем при последующих слияниях. Это, по сути, один вид другого в качестве ветки развития.

надеюсь, что это поможет.

Ответ 3

Слияние 2 подобных репозитов в один довольно прямолинейно.

  • создать голый репо

  • git добавить удаленный репозиторий в голое репо

  • git объединить мастер repo1 в голый репо

  • git добавить удаленный репо2 в голое репо

  • git объединить мастер repo2 в голый репо

  • git rm удаленный от repo1 и repo2

  • нажмите голый репо на сервер.