2012-06-03 2 views
9

У меня есть куча репозиториев git, каждая из которых содержит один файл. Я хотел бы объединить их все вместе, желательно за один шаг. Что я и добиваюсь этот график:Git octopus merge with unrelated repositoies

*----¬ mergedrepo/master 
| \ \ \ 
| | | * repoA/master 
| | * repoB/master 
| | | 
| | * repoB/... 
| * repoC/master 
* repoD/master 
| 
* repoD/... 

Я попробовал git merge, но, похоже, стратегия осьминога не работает для непересекающихся деревьев

$ git merge a/master b/master c/master d/master 
Unable to find common commit with a/master 
Automatic merge failed; fix conflicts and then commit the result. 

Мне также сказали, что git merge --squash поможет , но это дало ту же ошибку.

Это создает правильный график, но проигрывает все файлы:

$ git merge -s ours a/master b/master c/master d/master 

Как я могу идти об этом?

+0

Ваше слияние с осьминогом будет работать, вам просто нужно исправить конфликты, как говорится в сообщении. После устранения конфликтов вы сможете просто совершить. –

+2

@CharlesBailey: конфликтов нет! – Eric

+0

Да, есть: «Автоматическое слияние не удалось, устранить конфликты и затем зафиксировать результат». Чтобы разрешить конфликт, вы, вероятно, просто хотите добавить все конфликтующие пути, если файлы не используют одно и то же имя в репозиториях. –

ответ

3

Создание пустой фиксация

git commit -m "Common commit" --allow-empty 

взгляда на его хэш с log -1 и добавить его в трансплантаты файл без родителей

echo HASH_OF_COMMON_COMMIT >> .git/info/grafts 

затем найти все другие корни log --max-parents=0 и для каждого добавить их хэш в файл трансплантата с вышеуказанным хешем в качестве родителя

each HASH_OF_ROOT HASH_OF_COMMON_COMMIT >> .git/info/grafts 

и теперь, слияние!

Файл трансплантатов - это способ изменить родителей фиксации, и как только все ваши репозитории имеют общую фиксацию, ваше репо должно принять слияние.

4

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

  1. Сделайте слияние, как описано в OP. Он будет «терпеть неудачу», заявляя о конфликтах. Но слияние было выполнено и этот факт зафиксирован, хотя в индексе нет изменений.
  2. Добавить содержимое ветвей к индексу с помощью команды read-tree:

    git read-tree a/master b/master c/master d/master

    Это не влияет на рабочее дерево, только индекс будет обновляться.

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

  3. Обязательно.
  4. Выполните жесткий сброс (git reset --hard), чтобы получить согласованное рабочее дерево.

Возможно, позже вы можете отредактировать и исправить этот коммит, но я лично этого не пробовал.

+0

Вы, вероятно, имеете в виду 'git read-tree ...' вместо' git read-subtree ... '. Также, я уверен, читатели оценят, если вы дадите примеры кода для каждого шага, такого как 'git reset --hard' для шага 4. –

+0

О, действительно' read-tree'. Спасибо, что разъяснил это. – Vertigo

+1

В случае, если у кого-то возникли проблемы с этим: если вы не укажете имя ветки, в которую вы сливаетесь в команду 'git merge', вы должны включить ее в команду' git read-tree'. – dave4420