Могу ли я переместить каталог .git для репозитория в родительский каталог? - PullRequest
36 голосов
/ 05 марта 2009

У меня есть две подкаталоги, каждая с репо, таким образом:

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

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

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

Это возможно?

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

Та.

Ответы [ 3 ]

44 голосов
/ 05 марта 2009

Вы можете делать то, что вы описываете так:

  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

  2. То же самое для содержания 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

  3. Наконец, создайте репозиторий 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 вместе со всей историей.

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

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

5 голосов
/ 13 мая 2009

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

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

Как руководство:

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

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

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

0 голосов
/ 05 марта 2009

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

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

...