Могу ли я переместить каталог .git для репо в родительский каталог?

У меня есть два подкаталога с репо, поэтому:

PPP/
 |--ABC/
 |   |--.git/
 |   |--AAA/
 |   |    BBB/
 |   |   CCC/
 |   
 |--DEF/
 |   |--.git/
 |   |--DDD/
 |   |--EEE/

И хотел бы объединить их в одно репо, поэтому я бы предположил, что структура каталогов будет такой:

PPP/
 |--.git/
 |--ABC/
 |   |--AAA/
 |   |--BBB/
 |   |--CCC/
 |   
 |--DEF/
 |   |--DDD/
 |   |--EEE/

Возможно ли это?

В настоящее время несколько человек имеют репозитории на своих машинах. Насколько сложнее это делает жизнь?

Та.

Ответ 1

Вы можете делать то, что вы описываете следующим образом:

  • Переместите содержимое ABC в подкаталог ABC/ и исправьте историю, чтобы она выглядела так, будто она всегда была:

    $ cd /path/to/ABC
    $ git filter-branch --index-filter \
        'git ls-files -s | sed "s-\t-&ABC/-" |
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
         git update-index --index-info &&
         mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
    

    Теперь ваша структура каталогов ABC/ABC/your_code

  • То же самое для содержимого DEF:

    $ cd /path/to/DEF
    $ git filter-branch --index-filter \
        'git ls-files -s | sed "s-\t-&DEF/-" |
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
         git update-index --index-info &&
         mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
    

    Теперь ваша структура каталогов DEF/DEF/your_code

  • Наконец, создайте репозиторий PPP и потяните в него ABC и DEF:

    $ mkdir /path/to/PPP
    $ cd /path/to/PPP
    $ git init
    $ git pull /path/to/ABC
    $ git pull /path/to/DEF
    

    Теперь у вас есть PPP/ABC/your_code и PPP/DEF/your_code, а также вся история.

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

Примечание: команды funky filter-branch появляются на странице руководства.: -)

Ответ 2

Вам действительно нужно объединить два существующих репозитория в один репозиторий, или просто хотите сгруппировать их?

Если вы просто хотите сгруппировать их, то git -submodule будет делать то, что вы хотите: вы получите три репозитория, где верхний уровень связывается с текущими двумя.

В качестве руководства:

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

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

Использование подмодулей позволит избежать проблем с существующими копиями репозиториев, поскольку история не изменяется. Объединение их создаст новую историю, и людям, работающим из существующих веток, будет труднее объединить свои изменения.

Ответ 3

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

Мой лучший совет - создать новый репозиторий для хранения ABC и DEF, сохранив старое репо из этих двух, чтобы иметь резервное копирование истории и начать новую историю с этим новым проектом.