git管道命令以获取远程子模块

git管道命令以获取远程子模块,git,git-submodules,git-plumbing,Git,Git Submodules,Git Plumbing,我在一个只读文件系统中使用git管道和镜像(因此是裸的)repo 我可以通过git-ls-tree看到子模块的存在。我可以推断出它们的名称/路径和SHA1,但是我找不到一种方法来远程获取子模块 信息就在那里的某个地方;如果我克隆repo,git子模块init成功。(制作克隆对于正常使用来说太贵了,特别是对于非常大的存储库。)我如何直接访问远程子模块?Summary 从git config--blob HEAD:.gitmodules--列出开始。这需要Git版本>=1.8.4。请注意,HEAD可

我在一个只读文件系统中使用git管道和镜像(因此是裸的)repo

我可以通过
git-ls-tree
看到子模块的存在。我可以推断出它们的名称/路径和SHA1,但是我找不到一种方法来远程获取子模块

信息就在那里的某个地方;如果我克隆repo,
git子模块init
成功。(制作克隆对于正常使用来说太贵了,特别是对于非常大的存储库。)我如何直接访问远程子模块?

Summary 从git config--blob HEAD:.gitmodules--列出开始。这需要Git版本>=1.8.4。请注意,
HEAD
可以是任何修订

长格式与解释 注释转化为答案,大部分答案由OP.提供:-)此外,我们有以下自引用定义:超级项目是一个具有子模块的Git存储库,子模块(有时也称为子项目)是一个由超级项目控制的Git存储库。子模块本身通常在特定提交时保持签出(即作为“分离头”),尽管现在有一些特殊情况,您可以指示Git将子模块切换到命名分支。如果子模块有更多的子模块,“外部”子模块是“内部”子模块的超级项目,因此超级/子模块都是相对的

存储库URL及其签出路径的子模块由超级项目根目录中名为
.gitmodules
的文件提供。因此,在裸存储库中,您可以获取或提取
.gitmodules
文件。此文件的格式为配置文件,因此可以通过
git config--file
读取

自Git版本2.0以来,您可以使用伪名称
-
来引用stdin,因此:

git show HEAD:.gitmodules | git config --file - --list
将以熟悉的格式转储内容。(如果您的Git变体比它旧,但您有
/dev/stdin
,您可以在这里阅读
/dev/stdin
。)

事实证明,还有一种更简单的方法:
git config
可以直接从存储库中读取blob,因为git版本为1.8.4。blob标识符是git rev parse可以接受的任何东西,它不仅可以处理分支名或提交ID,甚至可以处理后续路径名。(此代码专门用于子模块处理:请参阅。)

细节 给定一个子模块路径p,子模块的名称为
submodule.name.path
设置为p的条目。然后,该子模块的URL为
submodule.name.URL

可以使用git config--get regexp搜索所需的名称。然而,这充其量也令人恼火,因为我们必须引用作为正则表达式元字符的路径名组件,其中最常见的是

$ 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] }'

(虽然当您将其放入一些可以读取查找GitLink的树的东西中时,您可能需要Python或类似的东西)。

由于git v2.x,您可以使用以下内容:

git config--file.gitmodules--get regexp'submodule\.\S+\.path'|
awk“{print$2}”|
xargs-i git-C{}远程获取url源
解释
  • 第1和第2个命令返回所有子模块的相对路径
  • 第三个命令在子模块的目录中执行
    git remote
    ,并获取它们的源url
  • 子模块的远程名称应为“origin”(由git设置为默认远程名称)
  • 子模块之前应该已经初始化过(例如,在超级项目内部执行
    git submodule update--init

它位于具有配置文件格式的
.gitmodules
文件中,因此,如果提取该文件,则可以在其上使用
git config-f
(又称
--file
)。但这本身就有点棘手
git show:.gitmodules
git cat文件-p:.gitmodules
将获取内容。如果你有
/dev/stdin
你可以通过管道将它们传输到
git config-f/dev/stdin
@torek你能把它变成一个答案,这样我就可以接受它吗?这正是我想要的。我可以,但我不确定您需要立即从
.gitmodules
文件中提取什么(即,您需要
git config-f…--get
。这很好。关键是知道数据隐藏在哪里。找出格式很简单。:)看起来您正在搜索子模块..path=其中是要匹配的路径。这就告诉你了。然后查找
submodule..url=
,一切就绪。