46

除了实际检查父提交之外,有没有办法根据父克隆中的提交 ID 确定子模块的 SHA-1 提交 ID?我知道我可以找到当前关联的 SHA-1 与git submodule.

这是一个例子:

  • 我有一个带有单个子模块的克隆,该子模块foo在上个月更改了几次。
  • 我在几周前的父克隆中有一个标签,称为released-1.2.3. 我想找出foo这个标记提交的相关 SHA-1 是什么。
  • 我可以简单地检查released-1.2.3并使用git submodule来查看,但我想知道是否有一种方法可以在影响工作树的情况下做到这一点,因为我想编写脚本。

我想这样做是因为我想构建一个脚本来对父存储库中的两个提交之间的子模块内的所有更改进行“差异” - 即“告诉我在父存储库中的foo这两个提交之间子模块内更改了哪些文件。 "

4

5 回答 5

57

您可以使用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 编写脚本时,请尽量坚持使用管道命令,如手册中所述。它们具有更稳定的界面,而更熟悉的“瓷器”命令可能会以不兼容的方式发生变化。

于 2010-10-24T20:03:50.860 回答
7

这个对我有用:

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

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

于 2015-06-29T12:27:09.493 回答
2

我确实找到了一条有希望的途径:

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

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

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

于 2010-10-21T02:41:00.680 回答
0

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

http://gitslave.sourceforge.net/

但是你也可以用普通的 git 来做到这一点。这并不容易。

于 2010-10-21T02:41:52.177 回答
0

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

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

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

git ls-tree v5.4.0

会给你目录的树 id submodules,而不是提交 id。如下所示。

040000 tree e542bc1b084a0394ff16452c27df6572366e0009    submodules

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

git ls-tree e542bc

你会得到这样的东西。

160000 commit 0f253bf94e0345600cb7a234a24eeec8ee3533bd  submodule_a
160000 commit 0edcbaf94e034987cb4eeec8ee3533bd12349ade  submodule_b

或者只是使用

git ls-tree v5.4.0 -r

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

于 2019-05-09T06:44:10.810 回答