如何使git-log向上滚动而不是向下滚动

时间:2016-03-02 09:36:42

标签: git terminal less git-log

每当我在终端模拟器中查看C:\users\administrator\pinglog.txt输出时,第一次提交都会在终端屏幕的顶部进行查看。当我使用git log --all --graph --oneline --decorate退出git log输出视图时,其中几行不再可见,因为在屏幕底部附加了一些新行,用于下一个命令。

通常,那些顶行是最有趣的,因为它们类似于最新的git历史,所以当我键入下一个git命令时,我希望它们仍然可见。

如何让q输出从屏幕底部开始显示,即第一次提交在底部查看?您必须向上滚动才能查看较旧的提交。

注意:由于两个原因,git log标志不是一个选项。

  1. 每次您必须一直滚动到底部才能查看第一个 提交。这不应该是必要的。我想从最底层开始。
  2. 它不与--reverse标志结合:--graph

4 个答案:

答案 0 :(得分:2)

这是一个似乎可以捕获大多数边缘情况的答案。未经彻底测试。

[alias]
    rlog = !"git --no-pager log --all --graph --decorate --oneline --color=always | tac | awk -f ~/switchslashes.awk | less -X +G -r"

文件~/switchslashes.awk包含

{
    match($0,/([[:space:][:cntrl:]|*\/\\]+)(.*)/,a) # find the segment of the graph
    tgt = substr($0,RSTART,RLENGTH)     # save that segment in a variable tgt
    gsub(/\//,RS,tgt)                   # change all /s to newlines in tgt
    gsub(/\\/,"/",tgt)                  # change all \s to /s in tgt
    gsub(RS,"\\",tgt)                   # change all newlines to \s in tgt
    gsub(/_/,"¯",tgt)                   # change all _ to ¯ in tgt
    print tgt substr($0,RSTART+RLENGTH) # print tgt plus rest of the line
}

this script的修改版本。它用下划线替换下划线,用反斜杠替换斜线,反之亦然。这会在文本被tac反转后修复图表。

<强>声明

我从未开始使用此功能,因为存储库较大时速度较慢。它需要加载所有内容然后应用替换,这需要花费太多时间来满足我的需求。

答案 1 :(得分:1)

首先,您可以将-n传递给日志,以打印出您感兴趣的任意数量的提交。

  

如何使git日志输出显示为反转

使用--reverse标志:

  

<强> --reverse

     

以相反的顺序输出提交。

git log --reverse

您可以在此处阅读有关git log的更多提示和标志:
http://www.alexkras.com/19-git-tips-for-everyday-use/

答案 2 :(得分:1)

A command that comes close to the intended result is

git --no-pager log --all --graph --decorate --oneline --color=always | tac | less -r +G -X

However, this still messes up the graph a little bit, as the slashes are not reversed properly.

Update

This command takes also care of swapping the slashes with backslashes and vice versa.

git --no-pager log --all --graph --decorate --oneline --color=always | tac | sed -e 's/[\]/aaaaaaaaaa/g' -e 's/[/]/\\/g' -e 's/aaaaaaaaaa/\//g' | less -r +G -X

The corresponding git alias is

[alias]
    rlog = !"git --no-pager log --all --graph --decorate --oneline --color=always | tac | sed -e 's/[\\]/aaaaaaaaaa/g' -e 's/[/]/\\\\\\\\/g' -e 's/aaaaaaaaaa/\\\\//g' | less -r +G -X"

答案 3 :(得分:1)

原始回答,不起作用,所以转到编辑工作版

如果直接从命令行使用,以下sed解决方案适用于我。它不依赖于\ /命令来使用任何临时字符串来切换sedy

$ git --no-pager log --all --graph --decorate --oneline --color=always | tac | sed 'h
s!\( *[0-9a-z]\{7\} .*\)\{0,1\}$!\1!
y/\\\/_¯/\/\\¯_/
x
s!\(.*\)\( *[0-9a-z]\{7\} .*\)\{0,1\}$!\2!
x
G
s/\n//' | less -X +G -r

它假设SHA代码长度为7个字符并使用它来识别&#34;什么是 \/|_*<space>的主要序列,我无法放在第一个s命令搜索模式的开头,而不是第二个.命令中的第一个s

我不知道为什么在将所有sed命令放入使用sed s -f选项调用的脚本中时,我无法使其工作。

编辑(以上代码实际上有问题)

正如@ user1902689指出的那样,sed脚本可以让任何人的眼睛流血,包括我自己,因为它们非常神秘。

在我看来,如果没有使用--color=always,那么任务就很容易完成,在这种情况下,文本从git log传出 就像我们在屏幕上看到的一样;相反,使用--color=always插入文本中插入的^[[33m等控制序列来控制着色(不同分支的不同颜色,......)。

但是有一个彩色输出很好,所以我将git log --color=always ...的输出定向到文件,并查看它,发现散列总是出现在^[[33m^[[m之间,其中^[是通过按 Ctrl + V 获得的单个字符,然后是 Esc 。这些本质上是由bash解释的转义序列,分别将颜色设置为黄色,然后返回白色(link)。

哈希,它不是行中唯一的7个字母数字字符串(例如 thiswrd可以在提交主消息中),几乎可以肯定是第一个一个,所以贪婪的表达式(sed has no non-greedy expressions)可以安全地使用之后,而之前不能(a .*之前hash-matching regexp会使regexp与行上的最后7个字母数字字符串匹配,例如,可能是anytext,并且哈希将在.*中的某处丢失。为了允许使用贪婪的.*以及它不会吞噬哈希值,我们可以将哈希值包含在不\n之间>与.中的.*匹配(因此,必须明确键入它们)。

认为以下代码(后面解释)不是确定的,因为它硬编码用于获取彩色哈希字符串的着色转义序列,但只要我尝试过它就可以工作

$ git --no-pager log --all --graph --decorate --oneline --color=always | tac | sed '
s/\(\(^[\[33m\)\([0-9a-z]\{7\}\)\(^[\[m\)\(.*\)\)/\2\n\3\n\4\5/
h
s/^.*\(\n[a-z0-9]\{7\}\n.*\|$\)/\1/
x
s/\n[a-z0-9]\{7\}\n.*$//
y/\\\/_¯/\/\\¯_/
G
s/\n\([a-z0-9]\{7\}\)\n/\1/
s/\n//' | less -X +G -r

每一行包含三个部分Graph OpeningColorTagHashClosingColorTag Message,或仅包含第一部分Graphsed字符串由9个命令组成,这些命令执行我打算对原始答案执行的操作,但是以稍微不同的方式(特别是因为某些命令的顺序被反转,以保存x命令)。

  1. 第一个s命令在\n字符串Hash的每一侧放置换行符[0-9a-z]\{7\}(如果此行中没有散列,则不执行任何操作;请注意合并/发散之前/之后的行没有哈希或跟随它们的消息)。这样做的目的是&#34;隔离&#34; Hash。请注意,捕获组\(...\)根据开放令牌\(的出现顺序进行编号,因此在替换字符串\2\n\3\n\4\5中:
    • \2引用^[\[33m,即OpeningColorTag(注:^[是通过点击 Ctrl + V ,然后 Esc ,而&#34; true&#34; [必须使用反斜杠\);
    • \3指的是Hash[0-9a-z]\{7\}
    • \4是指ClosingColorTag^[\[m(此处\2所说的内容也是如此);
    • \5是后面的任何内容,.*(隐含地直到行尾)。
  2. 现在模式空间(当前行,我们到目前为止已经编辑过)包含原始行,在散列(Graph OpeningColorTag\nHash\nClosingColorTag Message)的每一侧都有两个嵌入的换行符,或者未修改的原始行。它不包含任何哈希(Graph)。

    1. h命令&#34;保存&#34;进入保留空间的图案空间(将其视为抽屉)。
    2. 现在,模式和保留空间具有相同的内容(Graph OpeningColorTag\nHash\nClosingColorTag MessageGraph)。

      1. 第二个s命令只捕获和替换它自己(/\1/)并丢弃它之前的所有内容(^.* Graph OpeningColorTag ),(\|分隔捕获组\(...\)中的备选方案)
        • 新行封闭的哈希及其后的所有内容(即。提交主要消息)\n[a-z0-9]\{7\}\n.*
        • 或行尾$
      2. 现在模式空间包含\nHash\nClosingColorTag Message,如果没有散列,则为空字符串。

        1. x命令交换模式的内容并保留空格,以便多行\nHash\nClosingColorTag Message(或空字符串)保存在保留空间中,多行Graph OpeningColorTag\nHash\nClosingColorTag Message为在模式空间中,准备重新编辑。
        2. 第三个s命令命令从模式空间中删除\nHash及其后面的所有内容。
        3. 现在模式空间包含Graph OpeningColorTag

          1. y替换前两个非转义/之间的每个字符,以及第二个和第三个未转义的/之间的对应字符。必须使用反斜杠转义后退和正斜杠。 (这应该是安全的,因为OpeningColorTag不应包含任何翻译的字符。)
          2. 现在,模式空间包含Hparg OpeningColorTag,其中Hparg是&#34;倒置&#34;版本Graph(或仅Hparg。)

            1. G命令获取保留空间的内容并将其附加到(因此为大写G;小写g复制到附加到)模式空间,中间有换行符\n
            2. 现在模式空间包含Hparg OpeningColorTag\n\nHash\nClosingColorTag Message(或仅Hparg\n),从现在开始我们并不关心保留空间。

              1. 第四个s命令捕获\nHash\n部分并将其替换为Hash
              2. 现在,模式空间包含Hparg OpeningColorTag\nHashClosingColorTag MessageHparg\n

                1. 最后一个s命令会删除剩余的换行符\n
                2. 最后,模式空间包含Hparg OpeningColorTagHashClosingColorTag MessageHparg

                  步骤8和9.不能融合在一起(例如 s/\n\n\([a-z0-9]\{7\}\)\n/\1/),因为只有当行包含散列时,包含散列的两个\n才会存在(如果没有哈希值,则第1点的第一个s不执行任何操作,而第一个\n始终存在,因为它带有G命令。

                  <小时/> 实际上,不需要最外部的组\( ... \)(确实没有使用它),因此可以删除它,并且对其他捕获组的所有数字引用都可以减少1,例如 s/\(\(^[\[33m\)\([0-9a-z]\{7\}\)\(^[\[m\)\(.*\)\)/\2\n\3\n\4\5/可以更改为s/\(^[\[33m\)\([0-9a-z]\{7\}\)\(^[\[m\)\(.*\)/\1\n\2\n\3\4/;但是我会在答案中保留不必要的小组,因为它有机会提到不那么广为人知的捕获组编号。