git:--graph/--根提交的单线图标记字符

git:--graph/--根提交的单线图标记字符,git,Git,git具有丰富的日志格式化功能,允许以各种方式格式化存储库提交日志。我通常更喜欢--graph和--oneline选项,以分别使历史看起来更“自然”和更紧凑。在我的一个存储库中,我使用了没有公共父级的分支,因此,git log--graph--oneline master orphan产生如下结果: * 667788 (orphan) Orphan message 1 * 334455 (master) Master message 2 * 001122 (master) Master mess

git具有丰富的日志格式化功能,允许以各种方式格式化存储库提交日志。我通常更喜欢
--graph
--oneline
选项,以分别使历史看起来更“自然”和更紧凑。在我的一个存储库中,我使用了没有公共父级的分支,因此,
git log--graph--oneline master orphan
产生如下结果:

* 667788 (orphan) Orphan message 1
* 334455 (master) Master message 2
* 001122 (master) Master message 1
提交
001122
667788
是根提交,但它们在视觉上无法识别为根。是否可以让graph/oneline为根提交呈现另一个字符,而不是
*
,以便易于识别? 比如说

@ 667788 (orphan) Orphan message 1
* 334455 (master) Master message 2
@ 001122 (master) Master message 1

那太好了。有什么办法可以做到这一点吗?

这里有一个别名可以或多或少地工作:

x-log = "!f() { \
    git log --graph --no-abbrev-commit $@ \
    | sed 's/* \\(\\x1b\\[[0-9;]*m\\)\\?\\(commit \\)\\?\\('"$(echo -n $(git rev-list --max-parents=0 --no-abbrev-commit --all) | sed 's/ /\\\\|/g')"'\\)/@ \\1\\2\\3/g'; \
}; f"
“实验性”
log
实现如下:

  • 它可以使用bash函数
    f
    声明/调用模式接受任意数量的参数
  • 所有
    x-log
    参数都传递给backing
    log
    命令,该命令设置图形模式并强制执行完整的SHA-1输出,不使用缩写
  • sed
    模式通常是
    的s/*\(\x1b\[[0-9;]*m\)\(commit\){0,1\\\\(“$”(echo-n$(git rev list--max parents=0--no-abbrev commit--all)| sed's/\\\\\\\\\\\\\\\\/g')”)/@\1\2\3/g'
    但需要双斜杠转义符作为git别名:
    • *
      -默认图形节点标记
    • \(\x1b\[[0-9;]*m\)\?
      -可选ANSI转义模式(颜色支持;regex模式借用自)
    • \(commit\)\?
      -可选的
      提交
      ,同时出现在常规和图形
      日志
      结果中
    • \(“$”(echo-n$(git rev list--max parents=0--no-abbrev commit--all)| sed的/\\\\\/g')”\
      -这一个似乎是“可以用另一种方式完成”的很好候选(我不知道是否做对了).
      git rev list--max parents=0--all
      检索所有根提交的SHA-1哈希。这些哈希应该通过
      sed
      -转义管道(
      \\\124;
      )在一行中加入,而不带尾随新行(
      echo-n
      做得很好)
    • @\1\2\3
      -使用根标记
      @
      和上述捕获组呈现输出:
      \1
      是可选的ANSI模式,
      \2
      是可选的单词“commit”,
      \3
      分别是commit SHA-1哈希
此别名有以下限制:

  • 它不适用于缩写提交(因此,
    git x-log--oneline
    将不起作用,因为它意味着
    --abbrev commit
    ,除非它被
    --no abbrev
    显式覆盖),但可以通过全局修改别名源代码来改进或切换到
    --abbrev commit
  • 它禁用默认的寻呼机设置,因为git输出被写入管道以便使用
    sed
    进行处理,而不是直接写入stdout
  • 它还禁用默认颜色支持
  • 它严重依赖正则表达式
一些例子:

git x-log--all--color=始终
git x-log--all--pretty=oneline--color=always
我今天在我的WindowsGit安装上测试了它,但我相信它也应该在Linux上工作。
是的,如果Git能够支持这种开箱即用的方式,那将非常酷。

我已经设法对Git做了一些微小的更改。 新的布尔值
log.showRootMark
配置选项为初始提交启用
@
指示器。 默认行为保持不变

git-c log.showRootMark log--graph--oneline
git日志--图形--单线
修补程序(最初放在顶部):

Documentation/config.txt | 5+++++
文档/git-log.txt | 5+++++
图c | 20++++++++++++++++++++
t/t4202-log.sh|16++++++++++++++++
4个文件更改,46个插入(+)
diff--git a/Documentation/config.txt b/Documentation/config.txt
索引4e0cff87f..0a32357e3 100644
---a/Documentation/config.txt
+++b/Documentation/config.txt
@@-2254,6+2254,11@@log.showRoot::
像linkgit:git log[1]或linkgit:git whatchanged[1]这样的工具
通常隐藏根提交现在将显示它。默认情况下为True。
+log.showrotmark::
+如果为true,将标记`git log--graph`中的初始提交
+使用at符号(`@`)。否则初始提交将为
+用默认星号(`*`)标记。默认为False。
+
log.showSignature::
如果为true,则使linkgit:git日志[1],linkgit:git显示[1],并
linkgit:git whatchanged[1]假设“--show signature”。
diff--git a/Documentation/git-log.txt b/Documentation/git-log.txt
索引5437f8b0f..7f5436231 100644
---a/Documentation/git-log.txt
+++b/Documentation/git-log.txt
@@-205,6+205,11@@log.showRoot::
`git log-p`输出将在不附加差异的情况下显示。
默认值为“true”。
+log.showrotmark::
+如果为true,将标记`git log--graph`中的初始提交
+使用at符号(`@`)。否则初始提交将为
+用默认星号(`*`)标记。默认为False。
+
log.showSignature::
如果'true','git log'和相关命令将充当
`--“显示签名”选项已传递给他们。
diff--gita/graph.cb/graph.c
索引e1f6d3bdd..d14ffec7a 100644
---a/c
+++b/图c
@@-80,6+80,7@@static void graph\u show\u line\u前缀(const struct diff\u options*diffopt)
静态常量字符**列颜色;
静态无符号短列\u颜色\u最大值;
+静态int显示\u根\u标记;
静态无效解析图颜色配置(结构argv数组*颜色,常量字符*字符串)
{
@@-256,6+257,16@@void graph\u setup\u line\u前缀(struct diff\u options*diffopt)
}
+静态int git_graph_config(const char*var,const c
@ commit 411104dcfa8ed1e5c2b09f8ce26971a46ab4e64a
  Author: - <->
  Date:   Sun Dec 17 16:50:26 2017 +0200

      Orphan message 1

* commit a6485cee4bd1d4d8f23e2bd27b3678f40f5b7a26
| Author: - <->
| Date:   Sun Dec 17 16:48:57 2017 +0200
| 
|     Master message 2
| 
@ commit ce45a56a31369e83544adb8c18ee346185ad6380
  Author: - <->
  Date:   Sun Dec 17 16:48:45 2017 +0200

      Master message 1
* 411104d Orphan message 1
* a6485ce Master message 2
* ce45a56 Master message 1
@ 411104d Orphan message 1
* a6485ce Master message 2
@ ce45a56 Master message 1
@ 667788 (orphan) Orphan message 1
* 334455 (master) Master message 2
@ 001122 (master) Master message 1
* 667788 (orphan) Orphan message 1
* 334455 (master) Master message 2
* 001122 (master) Master message 1
 Documentation/config.txt  |  5 +++++
 Documentation/git-log.txt |  5 +++++
 graph.c                   | 20 ++++++++++++++++++++
 t/t4202-log.sh            | 16 ++++++++++++++++
 4 files changed, 46 insertions(+)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 4e0cff87f..0a32357e3 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -2254,6 +2254,11 @@ log.showRoot::
    Tools like linkgit:git-log[1] or linkgit:git-whatchanged[1], which
    normally hide the root commit will now show it. True by default.

+log.showRootMark::
+   If true, the initial commit in `git log --graph` will be marked
+   with the at sign (`@`). Otherwise the initial commit will be
+   marked with the default asterisk sign (`*`). False by default.
+
 log.showSignature::
    If true, makes linkgit:git-log[1], linkgit:git-show[1], and
    linkgit:git-whatchanged[1] assume `--show-signature`.
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index 5437f8b0f..7f5436231 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -205,6 +205,11 @@ log.showRoot::
    `git log -p` output would be shown without a diff attached.
    The default is `true`.

+log.showRootMark::
+   If true, the initial commit in `git log --graph` will be marked
+   with the at sign (`@`). Otherwise the initial commit will be
+   marked with the default asterisk sign (`*`). False by default.
+
 log.showSignature::
    If `true`, `git log` and related commands will act as if the
    `--show-signature` option was passed to them.
diff --git a/graph.c b/graph.c
index e1f6d3bdd..d14ffec7a 100644
--- a/graph.c
+++ b/graph.c
@@ -80,6 +80,7 @@ static void graph_show_line_prefix(const struct diff_options *diffopt)

 static const char **column_colors;
 static unsigned short column_colors_max;
+static int show_root_mark;

 static void parse_graph_colors_config(struct argv_array *colors, const char *string)
 {
@@ -256,6 +257,16 @@ void graph_setup_line_prefix(struct diff_options *diffopt)
 }


+static int git_graph_config(const char *var, const char *value, void *cb)
+{
+   if (!strcmp(var, "log.showrootmark")) {
+       show_root_mark = git_config_bool(var, value);
+       return 0;
+   }
+
+   return git_default_config(var, value, cb);
+}
+
 struct git_graph *graph_init(struct rev_info *opt)
 {
    struct git_graph *graph = xmalloc(sizeof(struct git_graph));
@@ -276,6 +287,7 @@ struct git_graph *graph_init(struct rev_info *opt)
                        custom_colors.argc - 1);
        }
    }
+   git_config(git_graph_config, NULL);

    graph->commit = NULL;
    graph->revs = opt;
@@ -835,6 +847,14 @@ static void graph_output_commit_char(struct git_graph *graph, struct strbuf *sb)
        return;
    }

+   /*
+    * If the commit has no parents, it's a root commit
+    */
+   if (show_root_mark && !graph->num_parents) {
+       strbuf_addch(sb, '@');
+       return;
+   }
+
    /*
     * get_revision_mark() handles all other cases without assert()
     */
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index 25b1f8cc7..350e35264 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -455,6 +455,22 @@ test_expect_success 'simple log --graph' '
    test_cmp expect actual
 '

+cat > expect <<EOF
+* Second
+* sixth
+* fifth
+* fourth
+* third
+* second
+@ initial
+EOF
+
+test_expect_success 'simple log --graph' '
+   test_config log.showRootMark true &&
+   git log --graph --pretty=tformat:%s >actual &&
+   test_cmp expect actual
+'
+
 cat > expect <<EOF
 123 * Second
 123 * sixth
-- 
2.16.2