Как перенести Git-проекты в один проект с подпроектами - PullRequest
16 голосов
/ 25 мая 2011

У меня есть несколько проектов, которые сейчас находятся в отдельных репозиториях Git.Они также находятся в отдельных проектах Eclipse (потому что я не мог долгое время использовать родительские проекты, использующие плагин Maven из-за ошибок в плагине m2).Теперь это работает.

Итак, я объединил проекты в Maven, создав базовый проект pom, добавив его в качестве родителя к другим.Затем я вложил подпроекты.

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

Похоже, что единственный способ сделать это - потерять всю историю в проектах, которые объединяются.

Просто чтобы быть супер ясным, текущие имеют:

Project A (repo A)
Project B (repo B)
Project C (repo C)

я хочу получить следующее:

New Base Project D (repo D)
   /Project A
   /Project B
   /Project C

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

Превратил решение в сценарий bash.Предполагается, что подпрограммы, которые вы хотите добавить, находятся в подкаталогах на одном уровне с родительским.Вот оно:

#! /bin/bash
git remote add -f $1 ../$1
git merge -s ours --no-commit $1/master
git read-tree --prefix=$1 -u $1/master
git commit -m "Added project $1"

Git удивительно ..

Ответы [ 3 ]

11 голосов
/ 25 мая 2011

Вы можете сделать то, что называется "объединением поддеревьев", чтобы объединить несколько репозиториев в одно. Предположим, вы хотите объединить ~/projects/alpha и ~/projects/beta в новый проект, ~/projects/multi:

$ cd ~/projects/multi
$ git init

Слияние в "альфа" проекте ...

$ git remote add -f alpha ~/projects/alpha
$ git merge -s ours --no-commit alpha/master
$ git read-tree --prefix=alpha -u alpha/master
$ git commit -m "Added project alpha"

Слить в "бета" проект таким же образом. Если изменение является постоянным, вы можете удалить альфа-пульт в вашем новом проекте. Если в альфа-репо все еще есть развитие, вы можете не только вести историю, но и вносить новые изменения.

Вся история все еще будет там, и проект будет находиться в подкаталоге. Я использую это на своем домашнем компьютере для «хранилища мертвых проектов» - массивного хранилища git, содержащего все, над чем я когда-либо работал, либо заброшенное, либо недостаточно большое для собственного репо.

2 голосов
/ 27 мая 2011

У меня недостаточно репутации, чтобы комментировать ваш исторический вопрос, поэтому я должен написать ответ.

Использовать --follow with log

--follow
       Continue listing the history of a file beyond renames (works only
       for a single file).
0 голосов
/ 25 мая 2011

Что я хотел бы сделать, это пойти на подмодули.Но если вы действительно хотите объединить репозитории, сделайте следующее:

  • создайте новый репозиторий
  • сделайте начальный коммит
  • сделайте ветки оттуда к каждому проектуЧто вы хотите объединить
  • для каждого проекта, который вы хотите объединить:
    • переключиться на его временную ветвь
    • объединить исходный репозиторий
    • переместить его вего каталог проекта (с git mv)
    • commit
  • объединить (в мастер) и удалить все временные ветки проекта
...