2012-01-19 4 views
3

У меня есть репозиторий B, содержимое которого должно находиться в подкаталоге A ... в A/src/B. Я хочу получить один репозиторий A, который включает в себя историю фиксаций как от A, так и от B.слияние репозиториев git на разных уровнях каталога

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

Итак, есть ли способ сделать это?

ответ

19

Это довольно просто, но команды не обязательно очевидны. Хорошей альтернативой, если вам понадобится добавить больше обновлений из B позже, является git-subtree (не путать с стратегией слияния поддерева). Вы говорите, что хотите получить один репозиторий, поэтому использование подмодулей git не подходит.

Вот классический способ сделать это, с некоторыми пояснениями:

  1. Изменение в хранилище A:

    cd A 
    
  2. Позовите master ветвь (или любой другой) из репозитория B, и (временно) хранить его как FETCH_HEAD:

    git fetch /home/whoever/dev/B master 
    
  3. Сделайте слияние, которое игнорирует изменения с FETCH_HEAD, но не совершает. Это значит, что мы сможем позже выполнить слияние, и родители слияния будут включать FETCH_HEAD. (Это родитель хранится в .git/MERGE_HEAD.)

    git merge -s ours --no-commit FETCH_HEAD 
    
  4. Прочитайте дерево из FETCH_HEAD (по-прежнему извлекается master ветвь B) в промежуточной области в подкаталоге src/B. -u средства отражают результат того, что в рабочей копии, а также:

    git read-tree --prefix=src/B/ -u FETCH_HEAD 
    
  5. Наконец фиксации результата:

    git commit -m "Merge in the history of master from B into src/B" 
    

Это похоже на то, что предлагается в GitHub's help page on the subtree merge strategy, за исключением что я пропустил создание пульта для B. Обратите внимание, что эта процедура фактически не использовала стратегию слияния поддерева - это было бы только для того, чтобы отменить дальнейшие изменения с B, если я правильно ее понимаю.

+0

это намного яснее для меня. Мне было трудно понять, что означает «наш» ... и я подумал, что выборка поместит файл в неправильный каталог. ... Благодаря. – fodon

Смежные вопросы