Git рекурсивно добавляет пульты в подмодули - PullRequest
3 голосов
/ 02 ноября 2019

У меня есть git-репозиторий, расположенный на моей машине в /path/to/repo, который содержит несколько подмодулей, /path/to/repo/submoduleA и /path/to/repo/foo/bar/submoduleB.

Из-за рабочего процесса, который я не могу изменить, git-репо копируется(как в scp -r) на удаленный сервер, где я работаю над кодом. Я хочу перенести изменения обратно на оригинальную машину. Клонирование / отправка с удаленного сервера не вариант.

Утомительно заходить в каждый подмодуль и делать

git remote add <name> <url>:/server/path/to/repo/<path to submodule>

Есть ли более быстрый путь? Что-то магическое, например

git remote add --submodules <name> <url>:/server/path/to/repo

, выполненное из репо верхнего уровня, которое будет повторяться в каждом субмодуле и добавлять соответствующий относительный путь на пульт каждого субмодуля? git remote --help ничего полезного не показывает, и ни один из разделов Git Pro Book о подмодулях .

Мой лучший выбор - что-то вроде

git submodule foreach 'git remote add <name> <url>:/server/path/to/repo/...'

может сработать, если есть способ заменить ... зависимым от цикла относительным путем каждого подмодуля в этом foreach. Я просто не знаю такого механизма, встроенного в git submodule foreach

1 Ответ

1 голос
/ 02 ноября 2019

git submodule foreach содержит список переменных, которые должны помочь:

Команда имеет доступ к переменным:

  • $name: имя соответствующего раздела подмодуля в .gitmodules,
  • $sm_path: путь подмодуля, записанный в непосредственном суперпроекте,
  • $displaypath: содержитотносительный путь от текущего рабочего каталога до корневого каталога подмодулей,
  • $sha1: фиксация, записанная в непосредственном суперпроекте, и
  • $toplevel: абсолютный путь к вершине-уровень непосредственного суперпроекта.

Итак, в вашем случае:

git submodule foreach 'git remote add $name <url>:/server/path/to/repo/$sm_path'

$displaypath заменит ... зависимым от цикла относительным путем каждого подмодуля.
Но, как отмечено в OP waldol1 в комментариях , $sm_path является фиксированным значением, а не относительным путем.

Пример сdocker/docker.github.io, выполнено в подпапке tests:

D:\git\docker.github.io\tests>git submodule foreach "echo $displaypath"
Entering 'src/github.com/gdevillele/frontparser'
src/github.com/gdevillele/frontparser

vs.

D:\git\docker.github.io\tests>git submodule foreach "echo $sm_path"
Entering 'src/github.com/gdevillele/frontparser'
tests/src/github.com/gdevillele/frontparser
...