Git Plumbing命令以获取子模块遥控器



我正在使用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)

最新更新