2009-03-05 3 views
35

У меня есть две поддиректории, каждая с репо, таким образом:Могу ли я переместить каталог .git для репо в его родительский каталог?

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

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

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

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

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

Ta.

+0

См. [Объединение нескольких репозиториев git] (http://stackoverflow.com/questions/277029/combining-multiple-git-repositories). –

ответ

42

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

  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 команды come from the man page. :-)

+2

Обратите внимание, что это будет обновлять текущую выписную ветвь только в каждом подпроекте и будет вытаскивать эти ветви только в новое репо. –

+12

BTW, альтернативный способ изменить текущее репо, чтобы переместить все в поддире, - это что-то вроде 'git filter-branch -tag-name-filter cat -index-filter 'SHA = $ (git write-tree); rm $ GIT_INDEX_FILE && git read-tree --prefix = ABC/$ SHA '- --all'. Это также перепишет все ветки и теги, а не только HEAD. –

+1

Команда funky filter-branch - из man-страниц git-фильтров. Вы должны сказать, что: a) он должен быть отнесен правильно b) Я не буду запускать такую ​​команду только потому, что кто-то, даже с высокой репутацией, разместил его на StackOverflow. Зная, что это с человеческих страниц. – mayu

0

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

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

5

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

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

В качестве ориентира:

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

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

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

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