为啥 pathspec 魔法 :(exclude) 不从 git log 的输出中排除指定的文件?

Posted

技术标签:

【中文标题】为啥 pathspec 魔法 :(exclude) 不从 git log 的输出中排除指定的文件?【英文标题】:Why isn't the pathspec magic :(exclude) excluding the specified files from git log's output?为什么 pathspec 魔法 :(exclude) 不从 git log 的输出中排除指定的文件? 【发布时间】:2014-10-11 07:59:32 【问题描述】:

这是Ignore files in git log -p的后续,也与Making 'git log' ignore changes for certain paths有关。

我使用的是 Git 1.9.2。我正在尝试使用 pathspec 魔术:(exclude) 来指定某些补丁不应该显示在git log -p 的输出中。但是,我想排除的补丁仍然显示在输出中。

这是一个重现这种情况的最小工作示例:

$ cd ~/Desktop
$ mkdir test_exclude
$ cd test_exclude
$ git init
$ mkdir testdir
$ printf "my first cpp file\n" > testdir/test1.cpp
$ printf "my first xml file\n" > testdir/test2.xml
$ git add testdir/
$ git commit -m "added two test files"

现在我想显示我历史中的所有补丁,除了那些对应于 testdir 文件夹中的 XML 文件的补丁。因此,跟随VonC's answer,我运行

$ git log --patch -- . ":(exclude)testdir/*.xml"

但我的testdir/test2.xml 文件的补丁仍然显示在输出中:

commit 37767da1ad4ad5a5c902dfa0c9b95351e8a3b0d9
Author: xxxxxxxxxxxxxxxxxxxxxxxxx
Date:   Mon Aug 18 12:23:56 2014 +0100

    added two test files

diff --git a/testdir/test1.cpp b/testdir/test1.cpp
new file mode 100644
index 0000000..3a721aa
--- /dev/null
+++ b/testdir/test1.cpp
@@ -0,0 +1 @@
+my first cpp file
diff --git a/testdir/test2.xml b/testdir/test2.xml
new file mode 100644
index 0000000..8b7ce86
--- /dev/null
+++ b/testdir/test2.xml
@@ -0,0 +1 @@
+my first xml file

我做错了什么?我应该怎么做才能告诉git log -p 不要显示与我的testdir 文件夹中的所有XML 文件关联的补丁?

【问题讨论】:

对于它的价值,它确实看起来应该有效。不过,Pathspecs 并没有很好的记录。 【参考方案1】:

没关系。该问题似乎已在 Git 1.9.5 中修复(更具体地说,在 commit ed22b4173bd8d6dbce6236480bd30a63dd54834e 中)。我上面问题中的玩具示例在 Git 2.2.1 中按预期工作:

$ git --version
git version 2.2.1
$ mkdir test_exclude
$ cd test_exclude/
$ git init
Initialized empty Git repository in /Users/jubobs/Desktop/test_exclude/.git/
$ mkdir testdir
$ printf "my first cpp file\n" > testdir/test1.cpp
$ printf "my first xml file\n" > testdir/test2.xml
$ git add testdir/
$ git commit -m "added two test files"
[master (root-commit) 5429d04] added two test files
 2 files changed, 2 insertions(+)
 create mode 100644 testdir/test1.cpp
 create mode 100644 testdir/test2.xml

$ git log --patch -- . ":(exclude)testdir/*.xml"
commit 5429d047f140f96c5d6167d083fc1a5eab05fb19
Author: xxxxxxxxxxxxxxxxxxxxxxxxx
Date:   Fri Dec 26 23:40:18 2014 +0100

    added two test files

diff --git a/testdir/test1.cpp b/testdir/test1.cpp
new file mode 100644
index 0000000..3a721aa
--- /dev/null
+++ b/testdir/test1.cpp
@@ -0,0 +1 @@
+my first cpp file

如您所见,在该git log 命令的输出中没有提及test2.xml,正如您所愿。

【讨论】:

以上是关于为啥 pathspec 魔法 :(exclude) 不从 git log 的输出中排除指定的文件?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu系统怎么还原??

git commit 错误:pathspec 'commit' 与 git 已知的任何文件都不匹配

“git add <file_name>”命令导致错误“致命:pathspec'file_name'没有匹配任何文件

Git使用之(pathspec master did not match any file(s) known to git)

问题解决error: pathspec ‘XXX‘ did not match any file(s) known to git

为啥我自己架设的传奇 物品数据库 魔法数据库加载错误?