制作';git日志';忽略某些路径的更改

制作';git日志';忽略某些路径的更改,git,Git,如何使git日志仅显示已更改文件的提交,而不是我指定的文件? 使用git log,我可以将看到的提交过滤到那些接触给定路径集的提交。我想要的是反转该过滤器,以便只列出指定路径以外的触摸路径 我可以用它得到我想要的 git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk 其中filter log.pl是: #!/usr/bin/perl use strict; use warning

如何使
git日志
仅显示已更改文件的提交,而不是我指定的文件?

使用git log,我可以将看到的提交过滤到那些接触给定路径集的提交。我想要的是反转该过滤器,以便只列出指定路径以外的触摸路径

我可以用它得到我想要的

git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk
其中
filter log.pl
是:

#!/usr/bin/perl
use strict;
use warnings;

$/ = "\n/\n";
<>;

while (<>) {
    my ($commit, @files) = split /\n/, $_;

    if (grep { $_ && $_ !~ m[^(/$|.etckeeper$|lvm/(archive|backup)/)] } @files) {
        print "$commit\n";
    }
}
#/usr/bin/perl
严格使用;
使用警告;
$/=“\n/\n”;
;
而(){
my($commit,@files)=拆分/\n/,$\u;
if(grep{$|&$| m[^(/$|.etckeeper$| lvm/(归档|备份)/)]}@files){
打印“$commit\n”;
}
}
除了我想要比这更优雅的东西

请注意,我不是问如何让git忽略这些文件。应跟踪并提交这些文件。只是,大多数时候,我对看他们不感兴趣

相关问题:除了提交消息而不是路径之外,这是相同的问题

2008年关于这个主题的论坛讨论:这看起来很有希望,但线索似乎已经干涸了。

您可以暂时忽略以下文件中的更改:

git update-index --skip-worktree path/to/file
接下来,
git status
git commit-a
等将忽略对这些文件的所有更改。当您准备提交这些文件时,只需将其反转:

git update-index --no-skip-worktree path/to/file

并正常提交。

tl;dr:
shopt-s extglob&&git日志!(不需要的/glob |另一个/不需要的/glob)

如果您使用的是Bash,您应该能够使用功能仅获取所需的文件:

$ cd -- "$(mktemp --directory)" 
$ git init
Initialized empty Git repository in /tmp/tmp.cJm8k38G9y/.git/
$ mkdir aye bee
$ echo foo > aye/foo
$ git add aye/foo
$ git commit -m "First commit"
[master (root-commit) 46a028c] First commit
 0 files changed
 create mode 100644 aye/foo
$ echo foo > bee/foo
$ git add bee/foo
$ git commit -m "Second commit"
[master 30b3af2] Second commit
 1 file changed, 1 insertion(+)
 create mode 100644 bee/foo
$ shopt -s extglob
$ git log !(bee)
commit ec660acdb38ee288a9e771a2685fe3389bed01dd
Author: My Name <jdoe@example.org>
Date:   Wed Jun 5 10:58:45 2013 +0200

    First commit
$cd--“$(mktemp--目录)”
$git init
已在/tmp/tmp.cJm8k38G9y/.Git中初始化空Git存储库/
$mkdir aye bee
$echo foo>赞成/反对
$git添加赞成/反对
$git commit-m“首次提交”
[主(根提交)46a028c]第一次提交
0个文件已更改
创建模式100644赞成/反对
$echo foo>bee/foo
$git添加bee/foo
$git commit-m“第二次提交”
[master 30b3af2]第二次提交
1个文件已更改,1个插入(+)
创建模式100644 bee/foo
$shopt-s extglob
$git日志!(蜜蜂)
提交ec660acdb38ee288a9e771a2685fe3389bed01dd
作者:我的名字
日期:2013年6月5日星期三10:58:45+0200
第一次提交
您可以将它与
globstar
结合起来进行递归操作。

它现在已经实现(git 1.9/2.0,2014年第1季度),引入了pathspec magic
:(排除)
及其缩写
在和中,由
,可以找到文档

您现在可以记录除子文件夹内容以外的所有内容:

git日志--。“:(排除)子项”
git日志--。“:!sub”
也可以排除该子文件夹中的特定元素

  • 特定文件:

    git日志--。“:(排除)子/子/文件”
    git日志--。“:!sub/sub/file”
    
  • sub
    中的任何给定文件:

    git日志--。“:(排除)子/*文件”
    git日志--。“:!sub/*文件”
    git日志--。:(排除,全局)子/*/文件
    
您可以使排除区分大小写

git日志--。:(排除,icase)子项
作为


如果您在Bash shell中运行Git,请使用
:!sub'
“:\!sub”
以避免


注:Git 2.13(2017年第2季度)将在
中添加同义词
^

参见(2017年2月8日)作者。
(于2017年2月27日被合并)

pathspec magic:添加“
^
”作为“
的别名'
“
的选择”结果不仅不匹配
我们所做的修订,它也是一个可怕的字符为壳牌
扩展,因为它需要引用

因此,添加“
^
”作为排除pathspec条目的替代别名


请注意,在Git2.28(2020年第3季度)之前,在工作树中收集包括未跟踪路径在内的路径时,反向pathspec的使用被中断

参见作者(2020年6月5日)
(于2020年6月18日合并)

:修复否定路径规范的处理 报告人:约翰·米利金
签字人:以利亚·纽伦

do\u match\u pathspec()
作为
match\u pathspec\u depth\u 1()
开始使用,为确保正确性,只能从
match\u pathspec\u depth()
调用
match\u pathspec\u depth()
后来被重命名为
match\u pathspec()
,因此我们今天期望的不变值是
do\u match\u pathspec()
match\u pathspec()之外没有直接调用方

不幸的是,这一意图随着两个函数的重命名而丢失,在提交中添加了对
do_match\u pathspec()
的额外调用(“ls文件”
:为子模块添加pathspec匹配”,2016-10-07,Git v2.11.0-rc0-中列出)和(“
dir
:如果我们的pathspec可能与dir下的文件匹配,则递归到其中”,2019-09-17,Git v2.24.0-rc0)

当然,
do_match_pathspec()
match_pathspec()
有一个重要的优势--
match_pathspec()
会将标志硬编码为两个值中的一个,而这些新的调用者需要为标志传递一些其他值

此外,尽管直接调用
do\u match\u pathspec()
是不正确的,但在可观察的最终输出中可能没有任何区别,因为该错误只是意味着
fill\u diretory()
将递归到不需要的目录中

由于随后对目录下的各个路径进行的Do this path match检查会导致过滤掉这些额外路径,因此使用错误函数的唯一区别是不必要的计算

do\u match\u pathspec()
的第二个错误调用是通过直接移动或复制+编辑,涉及到许多后续重构中

请参阅提交(“
dir
:同步
treat\u leading\u path()
read\u directory\u recursive()