После перемещения подмодуля git в другой каталог происходит сбой с ошибкой "git status --porcelain" в подмодуле

изначально у меня была следующая (упрощенная) структура РЕПО:

MyRepo
   external1/MySub (git submodule)
   .gitsubmodules

здесь

$ cat .gitsubmodules

  [submodule "external1/MySub"]
  path = external1/MySub
  url = user@repo:/remoterepo/externals/MySub.git

затем я хотел переместить MySubmodule в другой каталог в том же репозитории git, например,external2 так эта структура выглядит следующим образом:

MyRepo
   external2/MySub (git submodule)
   .gitsubmodules

что я сделал, и мысли достаточно, я просто переехал (через OS mv) the external1/MySub до external2/MySub и редактировал .gitsubmodules в:

$ cat .gitsubmodules

  [submodule "external2/MySub"]
  path = external2/MySub
  url = user@repo:/remoterepo/externals/MySub.git

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

$ git status

  fatal: Could not chdir to '../../../../../repo/external/MySub': No such file or directory
  fatal: 'git status --porcelain' failed in submodule repo/external2/MySub

что я упустил? Любые другие изменения должны быть сделаны для такой работы?

(Я использую git версии 1.8.3rc3 в Windows 8.1)

2 ответов


я просто переместил каталог external1/MySub в external2/MySub

двигаться как в mv (команда unix) или git mv (команда git)?

вам нужно передвигать специальная запись of индекс представление подмодуля родительского РЕПО.

нормально, (чтение git mv), этого должно было хватить:

git mv external1/MySub external2/MySub

перемещение подмодуля с использованием gitfile (что означает, что они были клонированы с версией git 1.7.8 или новее) обновит gitfile и core.worktree настройка, чтобы заставить подмодуль работать в новом месте.
Он также попытается обновить submodule.<name>.path настройка в gitmodules file и stage этот файл (если не используется-n).

это лучше всего работает с последним 1.8.5 git (например,msysgit для Windows или последний пакет В Unix)


Suseika добавляет в комментариях

если вы получаете сообщение

fatal: renaming '%submodule%' failed: No such file or directory

это, вероятно, потому, что вы добавляете уровень каталога, например, перемещение подмодуля"math "to"libs/math".
git mv не создает отсутствующие [промежуточные] каталоги, вы должны mkdir их самостоятельно.


git 2.9 (июнь 2016) улучшится git mv для подмодуля:

посмотреть совершить a127331 (19 апр 2016) by Стефан Беллер (stefanbeller).
(слитый Junio C Hamano -- gitster -- на совершить 9cb50a3, 29 апр 2016)

mv: разрешить перемещение вложенных подмодулей

.

Git 2.12 (Q1 2017) предлагает переместить вложенные подмодули в родительское РЕПО:

появился новый помощник подмодуля"git submodule absorbgitdirs " чтобы было проще перемещать встроенные .git/ каталог для подмодулей в a superproject to .git/modules/ (и указать последний с первым это превращается в "gitdir: " файл) был добавлен.

посмотреть совершить 7c4be45 (27 Dec 2016),совершить f6f8586, совершить 47e83eb, совершить 1a248cf (12 Dec 2016), и совершить 6f94351, совершить 89c8626, совершить 90c0011, совершить 6f94351, совершить 89c8626, совершить 90c0011 (08 Dec 2016) by Стефан Беллер (stefanbeller).
(слитый Junio C Hamano -- gitster -- на совершить da2b74e, 10 янв 2017)

подмодуля: добавить absorb-git-dir функции

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

добавить функциональность для переноса каталога git для поглощения в каталог git superprojects.

недавно добавленный код в этом патче структурирован таким образом, что другие области Git также может использовать его. Код в подмодуле -- helper является простым обертка и синтаксический анализатор параметров для функции absorb_git_dir_into_superproject, который заботится о внедрении каталог подмодулями Git в superprojects ГИТ реж. Эта функция использует более абстрактная функция для этого случая использования relocate_gitdir, который может быть использован например, код worktree в конечном итоге для перемещения по каталогу git.


Примечание: есть еще (Git 2.14.x / 2.15, Q4 2017) ошибка, связанная с перемещением подмодуля: см."Git: рекурсивное перемещение подмодулей (вложенных подмодулей)".


Git 2.15.x / 2.16 (Q1 2018) сделает движущийся подмодуль более надежным, так как "git fetch --recurse-submodules" теперь знает, что подмодули могут быть перемещался в суперпроекте в дополнение к получению обновлено, и находит те, которые должны быть выбраны соответственно.

посмотреть совершить 4b4aced, совершить c68f837 (16 окт 2017), и совершить 01ce122 (06 окт 2017) by Хайко Фойгта (hvoigt).
(слитый Junio C Hamano -- gitster -- на совершить b4d658b, 06 ноя 2017)

реализовать выборку перемещаемых подмодулей

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

более общим является сбор имен подмодулей для изменений вместо их пути включают в себя вышеуказанные случаи. Если у нас нет конфигурация для gitlink мы полагаемся на построение имени по умолчанию из путь, если репозиторий git можно найти по его пути. Мы пропускаем не настроен gitlinks, чье имя по умолчанию совпадает с настроен один.


отметим, что до Git 2.19 (Q3 2018), код, чтобы попытаться увидеть, нужна ли выборка в подмодуле во время выборки с --recurse-submodules запутался, когда путь к подмодуле был изменен в диапазоне коммитов в этот суперпроект, иногда показывающий"(null)".
Это было исправлено.

посмотреть совершить c3749f6, совершить 5fc8475 (14 июня 2018) by Стефан Беллер (stefanbeller).
(слитый Junio C Hamano -- gitster -- на совершить 085d2ab, 28 июня 2018)

submodule исправления:NULL корректность в переименованных сломанных подмодулях

при выборке с рекурсией в подмодули логика выборки проверяет суперпроект, подмодули которого на самом деле должны быть извлечены.
Это сложно для подмодулей, которые были переименованы в выборке диапазон коммитов. Это было реализовано в c68f837 (осуществить выборку переехал подмодули, 2017-10-16, Git v2.16.0), и этот патч исправляет ошибку в логике там.


Я изменил еще несколько вещей вручную, и он действительно работал с git 1.8.3rc3 (ненужный с git 1.8.5):

  1. исправить gitdir путь .git submodule repo/external2/MySub/.git:

    -gitdir: ../../../.git/modules/external1/MySub
    +gitdir: ../../../.git/modules/external2/MySub
    
  2. переименовать каталог подмодулей вrepo/.git/modules/ каталог

    $ mv repo/.git/modules/external1 repo/.git/modules/external2
    
  3. исправить worktree путь в repo/.git/modules/external2/MySub/config

    -worktree = ../../../../../external1/MySub
    +worktree = ../../../../../external2/MySub