用于搜索提交消息的Git别名

我确实在网上找到别名:

find = "log --decorate -i --all --date=short --grep"

search = "!f() { git log --decorate --grep=$1 -i --all --date=short; }; f"

它们都做同样的事情:在提交消息中搜索。有一个以某种方式比另一种“优越”吗?为什么?

问题-我们如何编写别名来搜索消息中包含特定单词的提交?

例如,其中:

git search-msg foo bar baz

是否按顺序匹配包含foobarbaz 的单词?

ANSWER-更好的格式设置(来自LeGEC):

search-msg = "!f() { str=\"git log --all-match\"; \
                     for var in \"$@\"; do \
                         str=\"$str --grep '$var'\"; \
                     done; \
                     eval $str; }; f"
jzh5939 回答:用于搜索提交消息的Git别名

您可能想通过向您的rev-list中添加git log来添加历史记录以搜索整个存储库

git log --grep 'Something relevant in my commits' $(git rev-list --all)

类似的东西应该在 .gitconfig 文件中起作用

[alias]
    search = "!f() { git log --grep \"$1\" $(git rev-list --all); }; f"
[log]
    date = iso

在这里date = iso可以得到更好的日期(当前格式为2019-11-26 17:35:30 +0100

,

首先介绍一下git log的--grep option

  • 您可以多次指定它
  • 默认的多个grep是“匹配任何模式”
  • 还有一个附加的--all-match flag,表示“匹配所有所有个模式”

示例:

# two commits contain 'foo' in their message (one of them also contains 'bar'):
$ git log --oneline --grep foo
b76121c bar baz foo
b7a342f foo

# two commits contain 'bar' in their message (one of them also contains 'foo'):
$ git log --oneline --grep bar
bbb27f3 (HEAD -> master) bar
b76121c bar baz foo

# if I look for both patterns : I get the union of both searches (3 commits)
$ git log --oneline --grep foo --grep bar
bbb27f3 (HEAD -> master) bar
b76121c bar baz foo
b7a342f foo

# if I add '--all-match' : only the commit which contains both is kept
$ git log --oneline --grep foo --grep bar --all-match
b76121c bar baz foo

要回答您的问题:这是一个示例脚本,该脚本包含一个参数列表,并将其转换为git log --all-match --grep aaa --grep bbb命令:

# in file git-search-msg :

#!/bin/bash

cmd=("log" "--all-match")

for var in "$@"
do
        cmd+=('--grep')
        cmd+=("$var")
done

git "${cmd[@]}"

如果将其粘贴到名为git-search-msg的文件中,然后将其放在PATH上的某个位置,那么git search-msg foo bar baz会做您想要的事情。


以下内容在普通sh中有效,但使用eval

#!/bin/sh
str="git log --all-match"

for var in "$@"
do
    # This loops takes arguments one by one and adds
    # them as '--grep' args to the 'git log' command.
    str="$str --grep '$var'"
done

# tech note : this sample script does not escape single quotes
eval $str

如果您设法将其排成一行(并正确地对其进行转义),则可以在别名中使用它。

请注意,尽管混有eval的转义问题...

,

通常,将git命令与匿名bash函数一起使用可让我们访问其他功能。

这是我所做的搜索别名的输出,可以满足您的需求。我用提交消息“ 1”,“ 2”,“ 3”,“ 4”创建了4个提交:

zrrbite@ZRRBITE MINGW64 /d/dev/git/test (new)
$ git ls -4
d0ebbb3 (HEAD -> new) 4 [Martin Kjeldsen]
174f539 3 [Martin Kjeldsen]
43d6a01 2 [Martin Kjeldsen]
05e7e0a 1 [Martin Kjeldsen]

zrrbite@ZRRBITE MINGW64 /d/dev/git/test (new)
$ git search 1 2 3 4
commit 05e7e0a232e093ddfcbd90d8071dc4a84e4295b7
Author: Martin Kjeldsen <kjeldsen@gmail.com>
Date:   Fri Nov 15 23:09:02 2019 +0100

    1
commit 43d6a019742a38c1b06aa7a40bc8f34d46d0dcc8
Author: Martin Kjeldsen <kjeldsen@gmail.com>
Date:   Fri Nov 29 00:57:38 2019 +0100

    2
commit 174f539b151533406b5fa7f2c8541dfeb194bfac
Author: Martin Kjeldsen <kjeldsen@gmail.com>
Date:   Fri Nov 29 00:57:46 2019 +0100

    3
commit d0ebbb3eb1071653b0578cfdd14c0d6a7c112b1f
Author: Martin Kjeldsen <kjeldsen@gmail.com>
Date:   Fri Nov 29 00:58:01 2019 +0100

    4

另一项测试:

zrrbite@ZRRBITE MINGW64 /d/dev/git/test (new)
$ git search 2 4
commit 43d6a019742a38c1b06aa7a40bc8f34d46d0dcc8
Author: Martin Kjeldsen <kjeldsen@gmail.com>
Date:   Fri Nov 29 00:57:38 2019 +0100

    2
commit d0ebbb3eb1071653b0578cfdd14c0d6a7c112b1f
Author: Martin Kjeldsen <kjeldsen@gmail.com>
Date:   Fri Nov 29 00:58:01 2019 +0100

    4

这里是别名,它只是循环遍历每个参数并调用git log --grep。等效于调用git log --grep <a> --grep <b> --grep <c> ...

[alias]    
search = "!f() { for l in \"$@\"; do git log --grep \"$l\"; done; }; f"
本文链接:https://www.f2er.com/3011157.html

大家都在问