每当我在终端模拟器中查看C:\users\administrator\pinglog.txt
输出时,第一次提交都会在终端屏幕的顶部进行查看。当我使用git log --all --graph --oneline --decorate
退出git log
输出视图时,其中几行不再可见,因为在屏幕底部附加了一些新行,用于下一个命令。
通常,那些顶行是最有趣的,因为它们类似于最新的git历史,所以当我键入下一个git命令时,我希望它们仍然可见。
如何让q
输出从屏幕底部开始显示,即第一次提交在底部查看?您必须向上滚动才能查看较旧的提交。
注意:由于两个原因,git log
标志不是一个选项。
--reverse
标志结合:--graph
。答案 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
解决方案适用于我。它不依赖于\
/
命令来使用任何临时字符串来切换sed
和y
。
$ 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
,或仅包含第一部分Graph
。
sed
字符串由9个命令组成,这些命令执行我打算对原始答案执行的操作,但是以稍微不同的方式(特别是因为某些命令的顺序被反转,以保存x
命令)。
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
是后面的任何内容,.*
(隐含地直到行尾)。现在模式空间(当前行,我们到目前为止已经编辑过)包含原始行,在散列(Graph OpeningColorTag\nHash\nClosingColorTag Message
)的每一侧都有两个嵌入的换行符,或者未修改的原始行。它不包含任何哈希(Graph
)。
h
命令&#34;保存&#34;进入保留空间的图案空间(将其视为抽屉)。现在,模式和保留空间具有相同的内容(Graph OpeningColorTag\nHash\nClosingColorTag Message
或Graph
)。
s
命令只捕获和替换它自己(/\1/
)并丢弃它之前的所有内容(^.*
,即 Graph OpeningColorTag
),(\|
分隔捕获组\(...\)
中的备选方案)
\n[a-z0-9]\{7\}\n.*
,$
,现在模式空间包含\nHash\nClosingColorTag Message
,如果没有散列,则为空字符串。
x
命令交换模式的内容并保留空格,以便多行\nHash\nClosingColorTag Message
(或空字符串)保存在保留空间中,多行Graph OpeningColorTag\nHash\nClosingColorTag Message
为在模式空间中,准备重新编辑。s
命令命令从模式空间中删除\nHash
及其后面的所有内容。现在模式空间包含Graph OpeningColorTag
。
y
替换前两个非转义/
之间的每个字符,以及第二个和第三个未转义的/
之间的对应字符。必须使用反斜杠转义后退和正斜杠。 (这应该是安全的,因为OpeningColorTag
不应包含任何翻译的字符。)现在,模式空间包含Hparg OpeningColorTag
,其中Hparg
是&#34;倒置&#34;版本Graph
(或仅Hparg
。)
G
命令获取保留空间的内容并将其附加到(因此为大写G
;小写g
将复制到中附加到)模式空间,中间有换行符\n
。现在模式空间包含Hparg OpeningColorTag\n\nHash\nClosingColorTag Message
(或仅Hparg\n
),从现在开始我们并不关心保留空间。
s
命令捕获\nHash\n
部分并将其替换为Hash
。现在,模式空间包含Hparg OpeningColorTag\nHashClosingColorTag Message
或Hparg\n
。
s
命令会删除剩余的换行符\n
。最后,模式空间包含Hparg OpeningColorTagHashClosingColorTag Message
或Hparg
。
步骤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/
;但是我会在答案中保留不必要的小组,因为它有机会提到不那么广为人知的捕获组编号。