代码之家  ›  专栏  ›  技术社区  ›  Owen Chen

提交(包含)后的git日志(带--图形)

  •  1
  • Owen Chen  · 技术社区  · 7 年前

    我就知道

    • 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 回复  |  直到 7 年前
        1
  •  2
  •   torek    7 年前

    有没有办法从概念上指导[one]命令的输出[作为另一个命令的参数]?

    贝壳( sh bash 或者您使用的任何shell命令解释器)通常都有一种方法来实现这一点。

    有两种常见的拼写,一种是使用反引号,这是非常短的项目方便,一种是使用反引号 $(...) 一般来说,这是更好的,因为它的巢适当。

    问题在于 git branch --contains * 如果它打印的包含给定提交的分支名称之一是当前分支。您必须做些什么来删除星号,或者使用更面向命令的命令。后者通常更好,但要求Git不要太旧(2.6或更高版本):replace git branch --contains <rev> git for-each-ref --contains=<rev> --format='%(refname)' ref/heads .

    现在,你不能把它变成一组 --branches= 对于 git log ,但你没有 需要 是的,因为 --branches=<glob> 是说什么 git日志 从匹配的引用开始 refs/heads/<glob> ,和 git for-each-ref 已经准备好了一份完整的参考文献清单。所以你要做的就是把完整的参考文献列表传给 git日志 .

    $name 作为一个包含一些名称的变量,我将在下面使用它,而不是 <...> ,这在其他方面是不明确的(它可能意味着文字小于符号等)。这将提供:

    git log $log_args $(git for-each-ref --contains=$rev --format='%(refname)')
    

    如果你的 每个参考的git --contains git分支--包含 去掉前两列,例如:

    git log $log_args $(git branch --contains $rev | cut -c3-)
    

    这有一个缺陷,因为 git branch 不在分支名称前面加前缀 refs/heads . 如果你有一个叫 xyzzy 一个标签 命名 吉特分行 分支 --branches=xyzzy 分支 而不是 标签 ,但只是命名 xyzzy公司 在命令行上,将获得标记,因为通常标记的优先级高于分支(看到了吗 the gitrevisions documentation ,其中列出了解析名称所采取的六个步骤: 试着把它当作一个标签 是步骤3和 把它当作树枝试一下 是第4步。标记具有更高的优先级。)来修复它以避免 this xkcd 你需要再想象一下:

    git log $log_args $(git branch --contains $rev | cut -c3- | sed s,^,refs/heads,)
    

    例如(当然,请参见 this xkcd