После перемещения подмодуля 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):
-
исправить
gitdir
путь .git submodulerepo/external2/MySub/.git
:-gitdir: ../../../.git/modules/external1/MySub +gitdir: ../../../.git/modules/external2/MySub
-
переименовать каталог подмодулей в
repo/.git/modules/
каталог$ mv repo/.git/modules/external1 repo/.git/modules/external2
-
исправить
worktree
путь вrepo/.git/modules/external2/MySub/config
-worktree = ../../../../../external1/MySub +worktree = ../../../../../external2/MySub