Git log - 如何过滤(排除)出现在`git log`中的文件?(git pathspec magic)

Cyr*_*don 7 git git-log git-commit

我需要使用该git-log命令在两个日期之间平均创建一个提交添加和删除行数的报告.

目前我使用的命令是:

git log --since="2015-12-01" --until="2015-12-31" --shortstat
Run Code Online (Sandbox Code Playgroud)

但我需要在过程中过滤一些文件.Thoses文件是自动生成的,我们不希望看到它们的影响.他们很容易通过他们的名字来识别*.generated.*

我选择使用该git-log命令,我能够获得我需要的报告,除了我没有看到如何过滤这些不需要的文件.

文档很大,我已经多次阅读了,但我没有看到任何基于名称过滤文件的内容.这是可能的,还是我必须找到另一个命令来查找提交添加/删除的行数?

Cod*_*ard 12

关于如何做到这一点的"秘密"称为:


pathspec magic


你可以简单地使用这种格式(在git版本> 1.9中引入):

# Use this syntax, pay attention to all the parameters and the syntax

# Unix: 
git log <any required flags> -p  -- . ':(exclude)*.generated.*'

# Windows (double quote) [ Thank to @Cyril Gandon for noticing it]:
# (double quote) should work on all OS as well
git log <any required flags> -p  -- . ":(exclude)*.generated.*"
Run Code Online (Sandbox Code Playgroud)

这个奇怪的语法是什么?

调用此语法pathspec magic.
使用此语法,您可以"告诉"git要排除哪些文件扩展名.在你的情况下,它是*.generated.*


来自doc:

http://git-scm.com/docs/gitglossary.html:

以冒号开头的pathspec:具有特殊含义.

在简短形式中,前导冒号:后跟零个或多个magic signature字母(可选地由另一个冒号:)终止,剩余部分是与路径匹配的模式.

magic signature由ASCII符号组成,既不是字母数字,也不是字母,正则表达式,也不是冒号.magic signature如果模式以不属于"魔术签名"符号集且不是冒号的字符开头,则可以省略终止的可选冒号.

在长形式中,前导冒号:后面是一个左括号(,一个逗号分隔的零或多个列表magic words,以及一个紧括的括号),余数是与路径匹配的模式.


注意

在旧版本中(该功能是在git v1.9中引入的,并且该bug已在git 1.9.5中修复),有一个错误已得到修复.

https://github.com/git/git/commit/ed22b4173bd8d6dbce6236480bd30a63dd54834e


演示:

git log --stat

(检查最后一次提交)
在此输入图像描述

和文件管理器一样 - 你可以看到结果中只有一个文件而不是2个

git log --stat -p -- . ':(exclude)*dal.js*'

在此输入图像描述

  • @codeWizard:你的评论中的拼写错误`git log -p`:`-p`代表*patch*,在你的例子中不是必需的,也不是OP的需要.它显示每个列出的提交的详细差异. (3认同)