如何让 git log 剪切长评论?

Posted

技术标签:

【中文标题】如何让 git log 剪切长评论?【英文标题】:How to make git log cut long comments? 【发布时间】:2014-02-17 13:49:00 【问题描述】:

我有一个 git log 别名,它将每个提交打印为一行。由于有些人在提交日志中写了太长的单行,因此许多提交换行。如何格式化 git log 输出以在 50 个字符后剪切评论?

我在 git-log 手册页中找到了这个,但它只会填充短的 cmets,不会切割长的。

%<(<N>[,trunc|ltrunc|mtrunc]): make the next placeholder take at least N columns,
  padding spaces on the right if necessary. Optionally truncate at the beginning (ltrunc),
  the middle (mtrunc) or the end (trunc) if the output is longer than N columns. Note that
  truncating only works correctly with N >= 2.

【问题讨论】:

【参考方案1】:

在文档中并不清楚需要哪些字符,但以下示例将主题行缩减为 50 个字符:

git log --oneline --format="%h %<(50,trunc)%s"

格式规范是%&lt;,其参数需要放在括号中。在这种情况下,50 个字符并截断多余的字符。

例如,在 msysGit 存储库上执行此操作会产生:

C:\src\msysgit>git log -n 5 --format="%h [%<(12,trunc)%aN] [%<(12,trunc)%cN] %<(50,trunc)%s"

218ed04 [Sebastian ..] [Sebastian ..] Merge pull request #154 from csware/tortoisegitp..
8a920b9 [Sven Stric..] [Sven Stric..] Installer: Detect TortoiseGitPlink from Tortoise..
448e125 [dscho       ] [dscho       ] Merge pull request #152 from csware/syscommand
db8d1bf [Sven Stric..] [Sven Stric..] Perl readline creates empty sys$command files if..
753d3d6 [Johannes S..] [Johannes S..] Git for Windows 1.8.5.2-preview20131230

【讨论】:

谢谢! “截断”部分是我正在寻找的。​​span> 谢谢 - 花了 30 分钟才弄明白这个魔法咒语 - 固定宽度 :) 这对我不起作用。我有 git --version => 1.7.10.4 (在 Debian 7.9 Wheezy 中)。从git-scm.com/docs/git-log/1.8.3 我收集到这个特性是在 1.8.3 中添加的(即 1.8.2.2 的手册页没有提到它)。 对我来说,这不仅仅是将长主题截断为 50,它还填充短主题以使它们成为 50 不垫就好了。我不知道该怎么做【参考方案2】:

派对迟到了,但这些选项也可以:

$ git config --global core.pager 'less -S'

或(例如)

$ echo $LESS
-R
$ export LESS=-RS

【讨论】:

效果很好。此外,线路长度适应终端宽度。来自less --help:“-S ... 切长线而不是换行”。这使得图表更具可读性,例如当使用git log --oneline --decorate --all --graph 漂亮!是否可以将它与 --no-pager 结合使用,即使用这个 and 将结果立即输出到终端而不会阻塞 less? 很高兴知道,但是,它会盲目地截断整行,从而导致意外行为,例如:git log --format="%h %ad \"%s\" (%an)" --date=short(最后是印刷作者)。此外,像我一样,OP 只要求截断“cmets”。 如果你想在输出小于一页时退出'less',也可以添加-E (--QUIT-AT-EOF) 选项。 感激不尽。这解决了我 90% 的 git log 格式化问题:“当 X 太长时,我如何让它不再看起来很糟糕??”。谢谢!!【参考方案3】:

仅截断和填充提交消息

根据其他答案,格式占位符%&lt;(50,trunc)%s 将打印截断为 50 个字符的提交消息。但这也会将较短的值填充到相同的值,并且没有办法告诉它不要这样做。

如果这适合你,那么你就完成了。如果不是,则需要另一种方法。

在终端宽度处截断整行

另外根据其他答案,您可以将less -S 配置为全局或每个存储库的core.pager 选项。这将在终端宽度处修剪整个日志字符串,避免换行。

但它会对所有 Git 命令执行此操作!(至少所有产生分页输出的命令)。

改进 - 仅针对特定命令截断

您可以使用 -c 选项执行此操作,例如git -c core.pager='less -S' log --graph --oneline

更好的是,将其设置为别名,这样您就不必每次都键入它:

git config --global alias.graph "-c core.pager='less -S' \
 log --graph --oneline`

两者结合

您还可以将其与格式化占位符结合使用。这是一个使用--graph 标志的示例,其中提交消息也被填充/截断为50 个字符,但由于--graph 选项创建了提交图的可变宽度绘图,因此您需要结合这两种方法。而且你不想每次都输入这个:

git config --global alias.graph "-c core.pager='less -S' \
log --pretty='tformat:%C(bold cyan)%h %C(blue)%<(10,trunc)%aN \
%<(50,trunc)%C(white)%s %C(auto)%d %C(dim green)%ar' --graph"

【讨论】:

【参考方案4】:

(我似乎完全无法适当地格式化评论,因此将其发布为答案,但实际上是对@patthoyts 回复的评论。)

trunc 的可爱之处在于它有衬垫,所以你可以像这样使用它:git log --pretty=format:"%ad %&lt;(50,trunc)%s %h" --date=short --reverse 产生一个更容易(至少在我看来)的概述。

$ git log --pretty=format:"%ad %<(50,trunc)%s %h" --date=short --reverse 2015-06-15 initial commit 5099ede 2015-06-16 Layout - Responsive grid added. 6534242 2015-06-17 html - H1 / Title updated <title>Testpage</title.. 88ea464 2015-06-18 Updating the Hotfix changes a8fbc47

提示 - 添加一个 alias 或 trunc 以方便您自己使用。git config --global alias.trunc 'log --pretty=format:"%ad %<(50,trunc)%s %h" --date=short --reverse'

【讨论】:

【参考方案5】:
git log --oneline

将显示剥离的提交头(有代码)

git log --pretty=oneline

将向您展示完整的提交头(有代码)

【讨论】:

这适用于 1.7 git,但不适用于 2.2 git。我试过了。我认为@patthoyts 建议的--format 解决方案可能是您唯一的 git 2.x 替代方案。【参考方案6】:

我把这个放到~/bin/git-mylog:

#!/bin/bash
COLS=$(tput cols)
git log --format="tformat:%>|(15)%C(auto)%h %Cgreen %<(20,trunc)%cn %C(auto) %<(15,trunc)%ar %<($((COLS-55)),trunc)%s" --graph

这里发生了一些事情,但它的核心是使用tput cols 获取终端宽度,然后进行一些算术以将注释宽度截断为实际可用空间而不是固定宽度。

【讨论】:

自动调整列宽和颜色看起来不错....

以上是关于如何让 git log 剪切长评论?的主要内容,如果未能解决你的问题,请参考以下文章

我如何使用任何命令来剪切命令输出

DataTables如何剪切字符串并添加(...)并将完整的字符串放在工具提示中

在 C# 中旋转图像时如何防止剪切?

文件名过长无法复制怎么解决

如何从 git diff 读取输出?

如何从 git diff 读取输出?