Git 日志 - 如何过滤(排除)文件以防止其出现在“git 日志”中? (git 路径规范魔法)

Git log - How to filter (exclude) files from appearing in `git log`? (git pathspec magic)

我需要使用 git-log 命令创建一个报告,记录两个日期之间按提交添加和删除的行数的平均值。

目前我使用的命令是:

git log --since="2015-12-01" --until="2015-12-31" --shortstat

但是我需要在这个过程中过滤一些文件。 这些文件是自动生成的,我们不想看到它们的影响。他们的名字很容易辨认 *.generated.*

我选择使用 git-log 命令,我能够得到我需要的报告,只是我不知道如何过滤那些不需要的文件。

The doc is big,我已经读过好几遍了,但我没有看到任何关于根据文件名过滤文件的内容。这可能吗,还是我必须找到另一个命令来查找行数 added/deleted by commit?

关于如何做到这一点的“秘密”叫做:


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.*"

这是什么奇怪的语法?

这个语法叫做pathspec magic.
使用此语法,您可以“告诉”git 要排除的文件扩展名。在你的情况下,它是 *.generated.*


来自文档:

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

A pathspec that begins with a colon : has special meaning.

In the short form, the leading colon : is followed by zero or more magic signature letters (which optionally is terminated by another colon :), and the remainder is the pattern to match against the path.

The magic signature consists of ASCII symbols that are neither alphanumeric, glob, regex special characters nor colon. The optional colon that terminates the magic signature can be omitted if the pattern begins with a character that does not belong to "magic signature" symbol set and is not a colon.

In the long form, the leading colon : is followed by a open parenthesis (, a comma-separated list of zero or more magic words, and a close parentheses ), and the remainder is the pattern to match against the path.


在旧版本中(该功能在 git v1.9 中引入,错误已在 git 1.9.5 中修复)有一个错误已修复。

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


演示:

git log --stat

(检查最后一次提交)

与文件管理器相同的残差 - 您可以看到结果中只有一个文件而不是 2

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