Git:分支间依赖图/列表

时间:2017-02-15 22:03:37

标签: git

我有时会有一些相关的功能分支,其中一些功能在其他分支上,比如

                o feature-B
               /
              /
          o--o feature-A
         /
        /
master o
        \
         o feature-C

我想显示一个图表,显示哪些分支取决于哪个,但很难让git log --graph产生我想要的东西。

以下内容未能显示分支机构之间的关系。

$ git log --graph --format='%h%d' ^master feature-{A,B,C}

* 801ecee208 (HEAD -> feature-B)
* e568acd804 (feature-A)
* f49ecc9e28
* a42d73d4bc (feature-C)

^master更改为^master~会改善一些事情,但会强制我包含我不关心的早期提交(origin/some-earlier-branch)。

$ git log --graph --format='%h%d' ^master~ feature-{A,B,C}

* 801ecee208 (HEAD -> feature-B)
* e568acd804 (feature-A)
* f49ecc9e28
| * a42d73d4bc (feature-C)
|/
* 67cf54dd0e (master)
* 40b72ecc6a (origin/some-earlier-branch)

这与我想要的非常接近,但省略最后一行会很好。

我真正想要得到的是一种清单,哪些分支取决于哪些分支。像

这样的东西
feature-A -> master
feature-B -> feature-A
feature-C -> master

所以我可以生成依赖关系的graphviz图。

1 个答案:

答案 0 :(得分:0)

这些实际上不是依赖(尽管这可能与您的目的无关)。

考虑这个简短的变体,例如:

    o   <-- foo
   /
  o
 /
o       <-- master

现在我们使用git branch bar foo~1添加分支标签bar

    o   <-- foo
   /
  o     <-- bar
 /
o       <-- master

如果foobar”取决于“bar,而foo可以随时眨眼和不存在,这似乎很奇怪。您需要的是 - 这将在您构建图表时告知您的想法 - 将此视为“bar master共享可访问的提交”。也就是说,您在此处需要的是创建提交列表及其父ID,然后关联各种ID。如果某个ID 可从分支提示A,B和C访问,则该提交与这三个分支名称共享其原因。

现在您只需要生成两个列表:

  • 每个分支提示的哈希ID,以及
  • 来自每个分支提示的每个提交可达的哈希ID,不包括您希望排除的任何名称可以访问的所有提交(例如for name in $names; do echo $name $(git rev-parse $name) done echo -- git rev-list --parents $names --not $exclude
例如,这应该做(我还没有测试过):

--

第一组行,直到$names,为您提供分支提示的名称到ID映射(当然,假设--中的所有名称都有效)。在--not $exclude到EOF之后的第二组行为您提供commit-ID,后跟该提交的所有父项的ID(一个用于常规提交,两个或更多用于合并提交,没有父项用于root提交) 。 $exclude确保您无法从%.00.png: %.dat genimg.py $< $@ %.10.png: %.dat genimg.py $< $@ %.20.png: %.dat genimg.py $< $@ %.30.png: %.dat genimg.py $< $@ 中的名称列表中获取任何提交。

请注意,多个分支名称可能指向单个分支提示,如果所有分支提示都在“排除”之后,则第二个ID集列表可能为空。