我怎么能得到一个git子模块相关的提交ID从父克隆过去的提交?

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

下面是一个例子:我有一个在上个月更换了几次的单个子模块“foo”的克隆。 我在几个星期大的父克隆中有一个标签叫'released-1.2.3'。 我想知道这个标记提交的相关SHA-1的'foo'是什么。 我可以简单地检查一下'released-1.2.3'并使用git-submodule来查看,但我想知道是否有办法在不影响工作树的情况下执行此操作,因为我想对其进行编写。

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

您可以使用git-ls-tree来查看给定提交期间给定path的SHA-1标识符:

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

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

由于您正在输出脚本,因此您可能需要自行获取SHA-1标识,例如:

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

另外:当围绕git编写脚本时,请按照手册中的描述,坚持使用pipe道命令。 他们有一个更稳定的界面,而更熟悉的“瓷器”命令可能会以不兼容的方式改变。

这个为我工作:

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

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

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

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

通过–raw选项,可以打印出与子模块关联的提交相对应的(缩写的)SHA-1 ID。 不幸的是,输出非常冗长,需要一些工作来处理脚本。

我真正需要的是一个git工具,在给定父提交ID的情况下,该工具会在提交之前给我一个子模块的最新更改。 也就是说,哪个子模块SHA-1'git submodule update'会检查出我是否真正检出了这个父提交。

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

http://gitslave.sourceforge.net/

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