我正在使用git plumbing和镜像(从而裸露的)repos,在可读的文件系统中。
我可以看到具有git ls-tree
的子模型的存在。我可以推断他们的名称/路径和sha1,但是我找不到一种获取子模块遥控器的方法。
这些信息在那里的某个地方;如果我克隆回购,则git submodule init
成功。(制作克隆对于正常使用太昂贵,尤其是对于非常大的存储库。)我该如何直接在子模块遥控器上获得?
摘要
从git config --blob HEAD:.gitmodules --list
开始,然后从那里开始。这需要git版本> = 1.8.4。请注意,HEAD
可以是任何修订版。
长形式和解释
评论变成了答案,并带有OP提供的许多答案。:-)另外,我们有以下自指的定义:A superproject 是一个具有子模型的git存储库,A subpodule (有时也称为A subproject)是由超级项目控制的GIT存储库。通常在特定的提交(即作为"分离的头")进行签署,尽管现在有特殊情况下,您可以将git转换为命名分支。如果子模块具有进一步的子模块,则"外部"类模块是"内部" subsodule的superproject,因此Super/sub都是相对的。
subsodules(存储库URL及其结帐路径)由SuperProject的根目录中的.gitmodules
提供的文件提供。因此,在裸仓库中,您将获得或提取.gitmodules
文件。此文件格式为配置文件,因此可以通过git config --file
读取。
自Git版本2.0以来,您可以使用伪名称-
参考Stdin,因此:
git show HEAD:.gitmodules | git config --file - --list
将以熟悉的格式倾倒内容。(如果您的git变体比那更古老,但是您有/dev/stdin
,则可以在此处阅读/dev/stdin
。)
事实证明,有一种更简单的方法:git config
可以直接从存储库中读取斑点,因为git版本1.8.4。BLOB标识符是git rev-parse
可以接受的任何东西,它不仅可以处理分支名称或提交ID,甚至可以处理后续路径名。(此代码专门用于子模块处理:请参阅COMM COMM 1BC888193E1044DB317A45B9A4C8D2B87B998F40。)
详细信息
给定一个子模块路径 p ,子模块的名称是将submodule.name.path
设置为 p 的任何条目。然后,该子模块的URL为submodule.name.url
。
可以使用git config --get-regexp
搜索所需的名称。但是,这充其量是令人讨厌的,因为我们必须引用正则表达式元字符的pathname组件,显而易见的是 .
:
$ git config --blob HEAD:.gitmodules
--get-regexp 'submodule..*.path' 'some/dir.name/path'
submodule.foo.path some/dir.name/path
因此,仅用--list
倾倒配置并使用其他内容来提取有趣的字段可能会更有意义。例如:
git config --blob HEAD:.gitmodules --list |
awk -F= -vpath='some/dir.name/path'
'$1 ~ /submodule..*.path/ && $2 == path { split($1, a, "."); print a[2] }'
(尽管当您将其放入可以阅读树木寻找GitLinks的东西中时,您可能想要Python或类似的东西)。
因为git v2.x您可以使用以下内容:
git config --file .gitmodules --get-regexp 'submodule.S+.path' |
awk '{print $2}' |
xargs -i git -C {} remote get-url origin
解释
- 第一和第二命令返回所有子模块的相对路径
- 第三命令在子模型目录内执行
git remote
,并获取其原点的URL
nb
- 子模块的远程名称应为"原始"(git设置为默认远程名称)
- 应该已经在开始之前先初始化子模型(例如,通过执行
git submodule update --init
superproject)