我有时会有一些相关的功能分支,其中一些功能在其他分支上,比如
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 :(得分:0)
这些实际上不是依赖(尽管这可能与您的目的无关)。
考虑这个简短的变体,例如:
o <-- foo
/
o
/
o <-- master
现在我们使用git branch bar foo~1
添加分支标签bar
:
o <-- foo
/
o <-- bar
/
o <-- master
如果foo
“bar
”取决于“bar
,而foo
可以随时眨眼和不存在,这似乎很奇怪。您需要的是 - 这将在您构建图表时告知您的想法 - 将此视为“bar
与 master
共享可访问的提交”。也就是说,您在此处需要的是创建提交列表及其父ID,然后关联各种ID。如果某个ID 可从分支提示A,B和C访问,则该提交与这三个分支名称共享其原因。
现在您只需要生成两个列表:
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集列表可能为空。