代码之家  ›  专栏  ›  技术社区  ›  davidA

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

  •  38
  • davidA  · 技术社区  · 14 年前

    目前 与SHA-1相关 git submodule

    下面是一个例子:

    • 我有一个带一个子模块的克隆 foo
    • 我在父克隆中有一个几周前的标记 released-1.2.3 . 我想知道 用于此标记的提交。
    • 我可以去看看 发布-1.2.3 使用 git子模块 想看看,但我想知道有没有办法 没有 影响工作树,因为我想编写脚本。

    我之所以要这样做,是因为我想构造一个脚本,以便在父存储库中两次提交之间对子模块中的所有更改执行“diff”,即“告诉我子模块中更改了哪些文件” 在父进程中的这两个提交之间。”

    4 回复  |  直到 5 年前
        1
  •  53
  •   Josh Lee ZZ Coder    8 年前

    你可以用 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 ,但“致命:坏对象”失败。)

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

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

        2
  •  6
  •   mash5    9 年前

    这个对我有用:

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

        3
  •  2
  •   davidA    14 年前

    我确实找到了一条有前途的道路:

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

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

        4
  •  0
  •   Adam Dymitruk    14 年前

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

    http://gitslave.sourceforge.net/

    但是你也可以用普通的git来完成这个。。不是那么容易。

        5
  •  0
  •   W.Perrin    5 年前

    git ls-tree 但有时你应该叫它几次或使用 -r 递归显示子项。

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

    例如,如果您有这样的项目目录,并且希望 submodule_a 在父模块中使用标记名。

    git ls-tree v5.4.0
    

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

    040000 tree e542bc1b084a0394ff16452c27df6572366e0009    submodules
    

    ls树 使用树id,您将得到每个子模块的实际提交id。

    git ls-tree e542bc
    

    你会得到这样的东西。

    160000 commit 0f253bf94e0345600cb7a234a24eeec8ee3533bd  submodule_a
    160000 commit 0edcbaf94e034987cb4eeec8ee3533bd12349ade  submodule_b
    

    或者只是使用

    git ls-tree v5.4.0 -r