Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.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
检索Git中特定提交的子提交列表_Git - Fatal编程技术网

检索Git中特定提交的子提交列表

检索Git中特定提交的子提交列表,git,Git,我想知道是否有一种有效的方法来检索给定提交的子级。 虽然在中讨论了一种方法,但它效率很低 我认为这将是在Git中完成的一件简单的事情,但显然不是 注意。git rev list可以显示子项,但这些子项必须可以从您提供的提交中访问。假设您希望显示从repo中的所有分支可以访问的所有子级,您可以使用 git rev-list --all --not $COMMIT^@ --children | grep "^$COMMIT" 这将输出一行,如下所示 $COMMIT $child1 $child2

我想知道是否有一种有效的方法来检索给定提交的子级。 虽然在中讨论了一种方法,但它效率很低

我认为这将是在Git中完成的一件简单的事情,但显然不是


注意。

git rev list
可以显示子项,但这些子项必须可以从您提供的提交中访问。假设您希望显示从repo中的所有分支可以访问的所有子级,您可以使用

git rev-list --all --not $COMMIT^@ --children | grep "^$COMMIT"
这将输出一行,如下所示

$COMMIT $child1 $child2 $child3 ...
为方便起见,您可以添加命令并将其转换为git别名:

children = "!f() { git rev-list --all --not $1^@ --children | grep $(git rev-parse $1); }; f" # reachable children of a ref

语法
$COMMIT^@
可能令人困惑,因此我将对此进行解释。希望
$COMMIT
是不言自明的。然后是
^@
,它将扩展到所引用提交的所有父级。所以
$COMMIT^@
意味着“所有
$COMMIT
的父母”。由于这遵循
--not
标志,这将指示
rev list
在命中
$COMMIT
的任何父级后停止处理。这基本上只是一个优化,因为从
$commit
可以访问的任何提交都不可能是子级


注意:这个答案的前一个版本说的是
tail-1
,而不是
grep“^$COMMIT”
。这可能在一个简单的测试repo中起作用(这就是我最初这么说的原因),但不能保证git rev list最后会发出
$COMMIT
,如果您有任何不包含
$COMMIT

的分支,我使用以下别名(基于:

  • 无参数-给出
    HEAD的所有子项
  • 使用
    commit ish
    -给出该对象的所有子对象

顺便说一句,我知道gitk会完成这项工作,但我需要将其嵌入shell脚本中。因此,gitk是一个不可能的工具!@LeonardoPassos:好的,已删除。“可访问”是什么意思?@hellogoodbay“可访问”也就是说,如果你从一个给定的提交开始,然后遍历该提交的所有父级,然后遍历这些提交的所有父级,等等,你最终会命中所讨论的提交。为什么遍历父级而不是子级?@hellogoodbay,因为这不是“可到达的”意味着。此外,父项与子项没有任何直接链接。每次提交都将其父项的SHA嵌入到提交对象中,该对象用于计算提交的SHA。根据定义,提交不能嵌入其子项,并且父项无法访问子项。
# Get all children of current or specified commit-ish
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $*' -"