2017-02-15 53 views
1

我有时有一些相关的功能分支,与其他一些建筑,如混帐:支路之间的依赖关系图/表

   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图的依赖关系。

回答

0

这些实际上并不是依赖关系(虽然这可能对您的目的无关紧要)。

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

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

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

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

这似乎很奇怪地说,foo “依赖” barbar可以在任何时候眨眼进出。你需要的是 - 当你去建立你的图表时,这会告诉你的想法 - 就是将这个视为“foo10股份可到达承诺提交bar”。也就是说,您需要的是制作提交列表及其父ID,然后关联各种ID。如果某个ID是,则从可以得到一个分支提示A,B和C,它们与这三个分支名称共享其原因。

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

  • 每个分支尖端的哈希ID和
  • 每个哈希ID从提交可达每个分支的顶端,不包括所有从提交到达什么希望排除(如master

此,例如,应该做的(我没有测试过)名称:

for name in $names; do 
    echo $name $(git rev-parse $name) 
done 
echo -- 
git rev-list --parents $names --not $exclude 

第一组行(最大为--)为您提供分支提示的名称到ID映射(当然,假设$names中的所有名称均有效)。第二组行(--到EOF后面)为您提供commit-id,后跟该提交的所有父代(一个用于常规提交,两个或更多用于合并提交,并且没有父级用于提交超级用户)的ID。 --not $exclude确保您没有从$exclude中的名称列表中获得任何提交。

注意,多个分支名称可能指向单个分支尖端提交,并且如果所有分支提示是“在或后面”的排除,的ID集第二列表可以是空的。