我试图从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命令忽略对该文件的更改。我做错了什么?
当前回答
如果你想这样做只是为了直观地检查差异,一个可视化的差异工具(如Meld)会让你用一个容易记住的简短命令来做。
首先,设置一个差异工具(如果你还没有的话)。
$ git config --global diff.tool = meld
然后,您可以运行目录差异。
$ git difftool --dir-diff
您将能够在Meld(或您选择的工具)中浏览差异(按文件)。不要打开你想要忽略的文件。
其他回答
你也可以使用patchutils程序集合的filterdiff程序来排除diff的某些部分。例如:
git diff | filterdiff -p 1 -x db/irrelevant.php
我的解决方案
git add .
git reset <list of files to ignore>
git diff --cached
简单的回答
git diff ':!db/irrelevant.php'
只是‘:!在你的diff命令后<path>'。diff命令可以像你喜欢的那样复杂,你可以使用通配符,如*.min.js或添加多个排除(空格分隔引号块)如果你愿意。
类似于本·鲁克斯的解决方案,但无论如何都是共享的:
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
真的很好的答案从KurzedMetal我需要做的,这是能够看到文件已经改变,但不产生差异,这可能是巨大的,在我的情况下。
但我的一个同事提出了一个更简单的方法,对我来说很有效:
在要被git diff忽略的文件所在目录中添加.gitattributes文件,内容如下:
file-not-to-diff.bin选项
这仍然让git状态“看到”文件是否发生了变化。Git diff也会“看到”文件被更改,但它不会生成diff。
示例中文件的扩展名是.bin。我知道这是二进制文件git的默认行为,它不需要用.gitattributes进行特殊处理。但在我的例子中,这些文件被git和“file”实用程序识别为文本文件,这就完成了任务。