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

StackOverflow https://stackoverflow.com/questions/614229

Вопрос

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

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

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

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

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

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

Ta.

Это было полезно?

Решение

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

  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 команды перейдите со справочной страницы. :-)

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top