Как перенести Git-проекты в один проект с подпроектами
У меня есть несколько проектов, которые сейчас находятся в отдельных репозиториях Git. Они также находятся в отдельных проектах Eclipse (потому что я не мог долгое время использовать родительские проекты, использующие плагин Maven из-за ошибок в плагине m2). Теперь это работает.
Поэтому я объединил проекты в Maven, сделав базовый проект, добавив его в качестве родителя к другим. Затем я вложил подпроекты.
Когда я решил зафиксировать базовый проект как 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 ответа
Вы можете сделать то, что называется "объединением поддеревьев", чтобы объединить несколько репозиториев в одно. Давайте предположим, что хотите слить ~/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, содержащего все, над чем я когда-либо работал, либо заброшенное, либо недостаточно большое для собственного репозитория.
У меня недостаточно репутации, чтобы комментировать ваш исторический вопрос, поэтому я должен написать ответ.
Используйте --follow с журналом
--follow
Continue listing the history of a file beyond renames (works only
for a single file).
Что бы я сделал, это пойти на подмодули. Но если вы действительно хотите объединить репозитории, сделайте следующее:
- создать новый репозиторий
- сделать первоначальный коммит
- сделать ветки оттуда к каждому проекту, что вы хотите объединить
- для каждого проекта, который вы хотите объединить:
- переключиться на его временную ветвь
- объединить исходный репозиторий
- переместить его в каталог проекта (с помощью git mv)
- совершить
- объединить (освоить) и удалить все временные ветки проекта