如何从父克隆的过去提交中获取git子模块的关联提交ID?

时间:2010-10-21 02:18:09

标签: git diff git-submodules

有没有办法,实际上没有检查父提交,根据父克隆中的提交ID确定子模块的SHA-1提交ID?我知道我可以通过'git submodule'找到当前关联的SHA-1。

这是一个例子:我有一个带有单个子模块'foo'的克隆,它在上个月已经多次改变了。我在父克隆中有一个标签,这个标签是几个星期,叫做'release-1.2.3'。我想知道'foo'的关联SHA-1对于这个标记的提交是什么。我可以简单地检查'release-1.2.3'并使用git-submodule来查看,但我想知道是否有办法在不影响工作树的情况下执行此操作,因为我想编写脚本。

我想这样做是因为我想构建一个脚本来对父存储库中两个提交之间的子模块中的所有更改执行'diff' - 即“告诉我这些子模块中foo'之间发生了哪些变化'在父母的两个提交。“

5 个答案:

答案 0 :(得分:49)

您可以使用git-ls-tree查看给定路径中给定路径的SHA-1 ID是什么:

$ git ls-tree released-1.2.3 foo
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  foo

(我的第一个想法是git show released-1.2.3 foo,但是失败了“致命:坏对象”。)

由于您正在为输出编写脚本,因此您可能希望自己只获取SHA-1 ID,例如:

$ git ls-tree released-1.2.3 foo | awk '{print $3}'
c0f065504bb0e8cfa2b107e975bb9dc5a34b0398

另外:在围绕git编写脚本时,请尝试坚持plumbing命令,如手册中所述。它们具有更稳定的界面,而更熟悉的“瓷器”命令可能会以不兼容的方式改变。

答案 1 :(得分:6)

这个对我有用:

$ git rev-parse released-1.2.3^{commit}:foo
<SHA1>

也许在脚本中也很容易使用。

答案 2 :(得分:2)

我找到了一条很有前途的大道:

$ git log --raw <since>..<until> --submodule -- <path/to/submodule>

使用--raw选项,这会打印出与子模块关联的提交相对应的(缩写)SHA-1 ID。不幸的是,输出非常冗长,需要一些工作才能在脚本中处理。

我真正需要的是一个git工具,给定父提交ID,在提交之前给我一个子模块的最新更改。即哪个子模块SHA-1'git子模块更新'将检查我是否实际检查了该父提交。

答案 3 :(得分:0)

git slave(gits)可能是你的答案。

http://gitslave.sourceforge.net/

但你也可以用普通的git来做这件事......这并不容易。

答案 4 :(得分:0)

git ls-tree将完成工作。 但是有时您应该多次调用它或使用-r递归显示子条目。

    ├─project
    │  └─submodules
    │      ├─submodule_a
    │      ├─submodule_b
    │      ├─...

例如,如果您有这样的项目目录,并且您希望在父模块中使用带有标签名称的submodule_a的提交ID。

git ls-tree v5.4.0

将为您提供目录submodules的树ID,而不是提交ID。看起来如下。

040000 tree e542bc1b084a0394ff16452c27df6572366e0009    submodules

只需使用树ID喂ls-tree,您将获得每个子模块的实际提交ID。

git ls-tree e542bc

您将得到类似的东西。

160000 commit 0f253bf94e0345600cb7a234a24eeec8ee3533bd  submodule_a
160000 commit 0edcbaf94e034987cb4eeec8ee3533bd12349ade  submodule_b

或者只是使用

git ls-tree v5.4.0 -r

检查所有条目的树ID或提交ID。