我试图从Git diff中排除一个文件(db/ irrelevance .php),我已经尝试将一个文件放在db子目录中,名为.gitattributes,并使用行irrelevance .php -diff 我还尝试创建了一个名为.git/info/attributes的文件,其中包含db/无关的。php。
在所有情况下,db/ irrelevance .php文件都作为Git二进制补丁包含在diff中。我想要的是由diff命令忽略对该文件的更改。我做错了什么?
我试图从Git diff中排除一个文件(db/ irrelevance .php),我已经尝试将一个文件放在db子目录中,名为.gitattributes,并使用行irrelevance .php -diff 我还尝试创建了一个名为.git/info/attributes的文件,其中包含db/无关的。php。
在所有情况下,db/ irrelevance .php文件都作为Git二进制补丁包含在diff中。我想要的是由diff命令忽略对该文件的更改。我做错了什么?
当前回答
真的很好的答案从KurzedMetal我需要做的,这是能够看到文件已经改变,但不产生差异,这可能是巨大的,在我的情况下。
但我的一个同事提出了一个更简单的方法,对我来说很有效:
在要被git diff忽略的文件所在目录中添加.gitattributes文件,内容如下:
file-not-to-diff.bin选项
这仍然让git状态“看到”文件是否发生了变化。Git diff也会“看到”文件被更改,但它不会生成diff。
示例中文件的扩展名是.bin。我知道这是二进制文件git的默认行为,它不需要用.gitattributes进行特殊处理。但在我的例子中,这些文件被git和“file”实用程序识别为文本文件,这就完成了任务。
其他回答
类似于本·鲁克斯的解决方案,但无论如何都是共享的:
git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff
或者,如果更改已经在本地提交:
git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master
例子:
git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master
git diff --name-only origin/master | grep -v docs | xargs git diff origin/master
你也可以使用patchutils程序集合的filterdiff程序来排除diff的某些部分。例如:
git diff | filterdiff -p 1 -x db/irrelevant.php
这种方法比公认的答案更短。
git diff 987200fbfb 878cee40ba -- ':!*.cs'
要了解更多关于不同的包含/排除可能性的信息,请阅读另一篇文章
天哪,驱动程序和awk排除一个糟糕的文件?自从git 1.9以来,你可以:
git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'
(在Windows上,将单引号'替换为双引号'。)
啊,优雅!请参阅引用的答案和@torek的回答
如果你想这样做只是为了直观地检查差异,一个可视化的差异工具(如Meld)会让你用一个容易记住的简短命令来做。
首先,设置一个差异工具(如果你还没有的话)。
$ git config --global diff.tool = meld
然后,您可以运行目录差异。
$ git difftool --dir-diff
您将能够在Meld(或您选择的工具)中浏览差异(按文件)。不要打开你想要忽略的文件。