Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 找到与给定祖先的关系_Bash_Git_Ancestor - Fatal编程技术网

Bash 找到与给定祖先的关系

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

我的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
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在它单击之前,我必须再考虑一下。我没有想到这些提示对于正确遍历图形是有用的。谢谢你的提示!