Git递归地将遥控器添加到子模块

时间:2019-11-01 22:34:57

标签: git git-submodules

我的机器上有一个/path/to/repo的git存储库,其中包含几个子模块/path/to/repo/submoduleA/path/to/repo/foo/bar/submoduleB

由于我无法更改工作流程,因此git repo被复制(如在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 section on submodules也没有显示。

我最好的猜测是

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

可能有用,如果有一种方法可以用该foreach中每个子模块的依赖于循环的相对路径替换...。我只是不知道git submodule foreach

中内置的这种机制

1 个答案:

答案 0 :(得分:1)

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中的the comments所指出的,$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