我试图从Git diff中排除文件(db/irrelevant.php
)。我已经尝试将一个文件放在db
子目录中,名为.gitattributes
,行irrelevant.php -diff
,我也尝试创建一个名为.git/info/attributes
的文件,其中包含db/irrelevant.php
。
在所有情况下,db/irrelevant.php
文件作为Git二进制补丁包含在diff中。我想要的是diff命令忽略对该文件的更改。我究竟做错了什么?
Omg,驱动程序和awk排除一个糟糕的文件?从git 1.9 something你可以:
git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'
啊,优雅!请参阅引用的答案和@torek的详细信息this answer
如果你想这样做只是为了目视检查差异,一个视觉差异工具(如Meld)将让你用一个易于记忆的简短命令来做到这一点。
首先,如果您还没有设置差异工具。
$ git config --global diff.tool = meld
然后,您可以运行目录差异。
$ git difftool --dir-diff
您将能够在Meld(或您选择的工具)中浏览差异(按文件)。只是不要打开要忽略的文件。
您可以使用no op命令设置自定义diff驱动程序,并将其分配给应忽略的文件。
使用此命令创建特定于存储库的diff驱动程序
git config diff.nodiff.command /bin/true
或者与--global
的所有回购。
(如果MacOS中不存在/bin/true
,替代方案将使用/usr/bin/true
或echo
)。
然后,将新的diff驱动程序分配给.git/info/attributes
文件中要忽略的文件。
irrelevant.php diff=nodiff
如果这个状态应该与其他开发人员共享,你可以使用.gitattributes
而不是.git/info/attributes
并与你的同行共享git config
命令(通过文档文件或其他东西)。
您还可以使用filterdiff程序集的patchutils程序来排除差异的某些部分。例如:
git diff | filterdiff -p 1 -x db/irrelevant.php
这个单行解决方案不需要其他工具/下载:
git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`
当然,file/to/exclude.txt
是您要排除的文件的名称。
编辑:信用ksenzee修复删除的文件打破差异。
KurzedMetal真的很好的回答我需要做的事情,这是能够看到文件已经改变,但不能生成差异,这可能是巨大的,在我的情况下。
但我的一位同事提出的方法更为简单,对我有用:
在.gitattributes
要忽略的文件所在的目录中添加git diff
文件,其中包含以下内容:
file-not-to-diff.bin -diff
这仍然让git status
“看到”文件是否更改。 git diff
也将“看到”该文件发生了变化,但它不会生成diff
。
该示例中的文件的.bin
扩展是故意的。我确实知道这是二进制文件的git的默认行为,并且它不需要使用.gitattributes
进行特殊处理。但在我的情况下,这些文件被git和“file”实用程序识别为文本文件,这就是诀窍。
类似于Ben Roux's解决方案,但无论如何共享:
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
这很简单,你可以使用标准的unix命令排除你想要的东西,即使在windows环境下,这些命令也可以在git bash下使用。下面的示例显示了如何为pom.xml文件排除diff,首先将diff检查为仅用于文件名的master,然后使用'grep -v'排除您不想要的文件,然后使用prepapred list再次运行diff到master:
git diff master `git diff --name-only master | grep -v pom.xml`
我做以下事情:
git add *pattern_to_exclude*
git diff
git reset HEAD .
我知道它不是一个优雅的解决方案,它有时不能使用(例如,如果你已经有阶段),但它可以做到这一点,而无需输入复杂的命令