2013-04-23 3 views
5

Недавнее изменение в Git изменило способ обработки каталога .git при использовании подмодулей. Вместо того, чтобы иметь один .git на каждый подмодуль, теперь все находится в каталоге «root level» .git (тот, который соответствует рабочей копии, включая подмодули).Перемещение рабочей копии git, содержащей подмодули

Затем в каждом подмодуле создается файл, который указывает на новое местоположение каталога .git.

В my project, у меня есть следующий .gitmodules файл:

[submodule "tests/shared-tests"] 
     path = tests/shared-tests 
     url = git://github.com/roboptim/roboptim-shared-tests.git 
[submodule "cmake"] 
     path = cmake 
     url = git://github.com/jrl-umi3218/jrl-cmakemodules.git 

Когда я git clone --recursive, я тогда получаем:

$ cat cmake/.git 
gitdir: /home/moulard/profiles/default-x86_64-linux-ubuntu-12.04.1/src/unstable/roboptim/roboptim-core/.git/modules/cmake 

я в настоящее время с помощью Git 1.8.1.5.

Мои вопросы:

  1. Почему это изменение поведения? Я не вижу очевидной выгоды для этой новой стратегии.
  2. Как я могу безопасно перемещать рабочую копию? (Если я двигаю рабочую копию, я получаю сообщение об ошибке говорит мне, что путь к разбитому gitdir не вместилище Git больше)

Обратите внимание, что это не то же самое, что и предыдущий вопрос Moving the parent directory of a git repository that contains submodules в что я уверен это не проблема, связанная с наличием абсолютного пути в моем .gitmodules файле.

ответ

8

.git/module организация восходит от git1.7.8 (December 2d, 2011):

При заполнении нового каталога подмодуль с «git submodule init», каталог $GIT_DIR метаинформации для подмодулей создается внутри $GIT_DIR/modules/<name>/ директории суперпроекте и ссылки через механизм gitfile.
Это позволяет переключаться между коммитами в суперпроекте, который имеет и не имеет подмодуля в дереве без повторного клонирования.

Однако последние исправления были включены в 1.8.2.1 и 1.8.3 (апрель 22d, 2013):

"мерзавец обновление подмодуль", когда рекурсия в суб-подмодулей, не acccumulate префиксные путей ,

Поэтому обновление до самого последнего выпуска git может решить эту проблему.


Здесь, один из возможных решений (с последним мерзавцем 1.8.3, апрель, 22d 2013), упоминается самая OP Thomas Moulard в the comments:

$ git submodule deinit -f . работает!
Тогда я могу запустить git submodule init и пути исправляются

Это заботится, если (де) шаги инициализации (.git/modules)

Он не заботится о «add» шаг, который записывает url подмодуля в файле .gitmodules: вам все равно нужно удалить его вручную в этом файле.

+0

Если все не удается, то, возможно, http://stackoverflow.com/a/15504813/6309? – VonC

+0

На самом деле я пробовал с последним выпуском Git и HEAD мастера, но пока не повезло, если нет команды git, о которой я не знаю ... –

+0

@ThomasMoulard последнее время 1.8.3 в вашем случае? – VonC

1

Я успешно сосредоточил свой рабочий экземпляр после перемещения его в другом месте, выполнив следующие действия:

  • Обновление gitdir: пути в superproject/path/to/submodule/.git файле
  • Обновление worktree= пути в superproject/.git/modules/path/to/submodule/config файле

Я не» я знаю, почему git использует абсолютные пути там!

(Проверено на мерзавца 2.0.1.563)

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