我知道
git branch --contains <REVISION>
可以显示自<REVISION>
起的所有子分支的名称git log --branches=<BRANCH_REGEX>
可以过滤分支从概念上讲,有什么方法可以将前一个命令的输出定向到后者吗?
即 git branch --contains <REVISION> | git log --branches=
目标是在使用git log --decorate --graph --oneline [OTHER_OPTIONS]
谢谢〜
答案 0 :(得分:2)
有什么方法可以在概念上指导[一个]命令的输出[作为另一个的参数]?
shell(sh
或bash
或您使用的任何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。)