删除git-log中%N格式说明符的尾随换行符

f87krz0w  于 2023-05-05  发布在  Git
关注(0)|答案(2)|浏览(103)

git log中显示带有%N的注解时,是否可以轻松地修剪换行符?
我想通过使用git-notes添加提交的元数据,并使用如下方式查看它:

git log --format=format:'%h [%N] %an %s %D'

这看起来比创建带有元数据前缀的提交消息要干净得多,这是目前的常见做法,但似乎注解上总是有一个尾随的换行符。
关于如何轻松地删除它而不通过外部工具过滤的任何建议?

bfrts1fy

bfrts1fy1#

使用%N%-C()
%N你懂的%-C()中的-表示“如果为空,则删除紧接在前的换行符”,并且空颜色规范C()为空。
来自评论:
OP使用的是%<(20,trunc)%N,默认情况下,注解有一个格式化程序不剥离的显式编码的尾随换行符,因此一个10字节的注解将有一个第11字节的换行符,然后固定宽度将用空格将其填充为20字节。. .和%-C()将看到紧接在前面的空间并且什么都不做。
此OP的一个解决方法如下:使用%>(20,trunc)代替,短注解将右对齐,因此尾随的换行符将始终出现在那里。
另一个是@Guildenstern在评论这个问题时提出的:使用一个trailer,它的值在概念上不包含嵌入的尾随换行符。
git notes将为添加的注解提供任何“缺失”的尾随换行符,即使是来自文件;要自己创建一个没有尾随换行符的注解,你必须手动创建blob,并使用预制的对象创建它,但即使这样,git log的格式化程序也会将它添加回去。因此,如果你想在固定宽度的字段中格式化数据,并保持notes相对于trailers的灵活性优势,看起来rj几乎是唯一的选择。

epggiuax

epggiuax2#

当前的git似乎不支持此功能,但以下修补程序似乎可以工作:

diff --git a/notes.c b/notes.c
index 02f1aa39ae..21001b2261 100644
--- a/notes.c
+++ b/notes.c
@@ -1306,7 +1306,9 @@ static void format_note(struct notes_tree *t, const struct object_id *object_oid
                if (!raw)
                        strbuf_addstr(sb, "    ");
                strbuf_add(sb, msg_p, linelen);
-               strbuf_addch(sb, '\n');
+               if (!raw) {
+                       strbuf_addch(sb, '\n');
+               }
        }
 
        free(msg);

相关问题