Bash 找到与给定祖先的关系
我的git存储库一度包含以下结构:Bash 找到与给定祖先的关系,bash,git,ancestor,Bash,Git,Ancestor,我的git存储库一度包含以下结构: A1 A2 A3 o-----o-----o \ \ o X o Y B1 B2/ B3/ o-----o-----o \ o Z C1 C2/ o-----o 我正在尝试检索最早的提交,它是多个指定提交的后代。分阶段将是提交日期。例如: descendant A1 B2 -> X descendant A2 B3 -> Y desc
A1 A2 A3
o-----o-----o
\ \
o X o Y
B1 B2/ B3/
o-----o-----o
\
o Z
C1 C2/
o-----o
我正在尝试检索最早的提交,它是多个指定提交的后代。分阶段将是提交日期。例如:
descendant A1 B2 -> X
descendant A2 B3 -> Y
descendant A1 C1 -> nothing
合并提交可能有两个以上的父级。我已经找到了很多关于git merge base的文档,它执行的任务与此相反,但找不到任何函数至少可以返回一个可以排序的子体列表。经过进一步研究,我终于拼凑出了以下内容。它很难看,可能效率很低,但看起来很有效
#!/bin/bash
common_descendants=$(git rev-list --ancestry-path --all $1.. | sort)
shift
while [ $# -ne 0 ]; do
common_descendants=$(
echo "$common_descendants"
| comm -12 --nocheck-order - <(
git rev-list --ancestry-path --all $1.. | sort
)
)
shift
done
git rev-list --reverse --date-order --no-walk $common_descendants | head -n 1
#/bin/bash
common_后代=$(git版本列表--祖先路径--所有$1..|排序)
转移
而[$#-ne 0];做
普通后裔=$(
回显“$common_后代”
|comm-12--nocheck order-As,Git只有向后指针。查找提交C的后代必须转换为一个新的不同问题,这是:查找提交T的祖先,这些祖先本身就有提交C作为祖先。这里是一个tip提交,或者在您的例子中,可能是许多tip提交所有分支,可能是所有标记以及所有其他参考资料
git rev list
命令适用于解决该问题。特别是,您可以让它从尖端(子体)到父体遍历图形,但收集在过程中遍历的边,然后使用--children
反转它们。注意,这允许父体重写和简化历史
(我认为您需要在您选择的任何开始提示提交上运行git rev list--children
,并自己解析其输出以应用其他约束。您可以使用正在搜索的提交的父项作为停止点,使用来剪切图迭代。请注意,这实际上是引导^
,这类似于——不是,而是本地而不是全局,应用于rev^@
)Git只跟踪提交的父项,而不跟踪子项。只给定A1
和B2
,除了检查每个提交是否有A1
和B2
作为祖先之外,找不到它们的共同后代。要添加到@chepner的注释中,这个术语是DAG(有向无环图)。每个节点之间的边是单向的。--祖先路径
将得到与我建议的类似的结果:在这里,您使用头
作为枚举向后运行的点,然后还将丢弃既不是头
的祖先也不是限制提交的后代的提交。您将g但是,特定的限制提交了它们自己,这可能是最低公共后代的答案。@torek在它单击之前,我必须再考虑一下。我没有想到这些提示对于正确遍历图形是有用的。谢谢你的提示!