git log after(contains)commit? (带有--graph)

时间:2018-10-04 10:07:59

标签: git branch git-branch git-log

我知道

  • git branch --contains <REVISION>可以显示自<REVISION>起的所有子分支的名称
  • git log --branches=<BRANCH_REGEX>可以过滤分支

从概念上讲,有什么方法可以将前一个命令的输出定向到后者吗?
git branch --contains <REVISION> | git log --branches=

目标是在使用git log --decorate --graph --oneline [OTHER_OPTIONS]

时过滤分支

谢谢〜

1 个答案:

答案 0 :(得分:2)

  

有什么方法可以在概念上指导[一个]命令的输出[作为另一个的参数]?

shell(shbash或您使用的任何shell命令解释器)通常都有这样做的方法。

有两种常见的拼写,一种使用反引号,对于很短的项目很方便,另一种使用$(...),因为嵌套正确,所以通常更好。

git branch --contains的问题是它的输出格式不正确:如果它打印的包含给定提交的分支名称之一是当前分支,它将打印*。您必须执行某些操作以删除星号,或使用更面向命令的命令。后者通常更好,但要求您的Git不太旧(2.6或更高版本):将git branch --contains <rev>替换为git for-each-ref --contains=<rev> --format='%(refname)' ref/heads

现在,您不能将--branches=的{​​{1}}变成一组全局模式,但是您不需要 ,因为所有{{1 }}告诉git log从与--branches=<glob>匹配的引用开始,而git log已经准备好生成此类引用的完整列表。因此,您要做的就是将完整的引用列表传递到refs/heads/<glob>

由于外壳程序还将git for-each-ref扩展为具有某些名称的变量,因此我将在下面使用该名称代替git log,否则该名称将是模棱两可的(可能表示字面的小于号等)。这给出了:

$name

如果您的<...>年纪太大,无法处理git log $log_args $(git for-each-ref --contains=$rev --format='%(refname)') ,则必须使用git for-each-ref并去除前两列,例如:

--contains

这有一个缺陷,因为git branch --contains不会为分支名称加上git log $log_args $(git branch --contains $rev | cut -c3-) 前缀。如果您有一个名为git branch 的分支,并且还有一个名为refs/heads的标签 ,则xyzzy会使用 branch < / em>名称,而xyzzy会知道使用分支而不是 tag ,但是只需在命令行上命名git branch您使用标签,因为通常标签的优先级高于分支。 (请参阅the gitrevisions documentation,其中列出了解析名称所采取的六个步骤:将其尝试作为标签是步骤3,将其尝试作为分支是步骤4标签具有更高的优先级。)要解决此问题(避免使用this xkcd),您需要对其进行更多设置:

--branches=xyzzy

例如。 (当然,也请参见this xkcd。)