我试图从Git diff中排除一个文件(db/ irrelevance .php),我已经尝试将一个文件放在db子目录中,名为.gitattributes,并使用行irrelevance .php -diff 我还尝试创建了一个名为.git/info/attributes的文件,其中包含db/无关的。php。

在所有情况下,db/ irrelevance .php文件都作为Git二进制补丁包含在diff中。我想要的是由diff命令忽略对该文件的更改。我做错了什么?


当前回答

我做以下事情:

git add *pattern_to_exclude*
git diff
git reset HEAD .

我知道这不是一个优雅的解决方案,它有时不能被使用(例如。如果你已经把东西准备好了),但它不需要输入复杂的命令就能完成任务

其他回答

这很简单,你可以使用标准的unix命令排除你想要的,这些命令在git bash下甚至在windows环境下都是可用的。 下面的例子展示了如何排除pom.xml文件的diff,首先检查diff只对文件名进行master,然后使用'grep -v'排除你不想要的文件,然后使用prepared list再次运行diff来master:

git diff master `git diff --name-only master | grep -v pom.xml`

简单的回答

git diff ':!db/irrelevant.php'

只是‘:!在你的diff命令后<path>'。diff命令可以像你喜欢的那样复杂,你可以使用通配符,如*.min.js或添加多个排除(空格分隔引号块)如果你愿意。

git diff remote/master..master --name-only -- ':!README.rst'

给我(git版本2.11.0)

fatal: There is nothing to exclude from by :(exclude) patterns.
Perhaps you forgot to add either ':/' or '.' ?
git diff remote/master..master --name-only -- './*' ':!README.rst'

工作得很好,来源:https://stackoverflow.com/a/30084612/5155484

类似于本·鲁克斯的解决方案,但无论如何都是共享的:

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

这种方法比公认的答案更短。

git diff 987200fbfb 878cee40ba -- ':!*.cs'

要了解更多关于不同的包含/排除可能性的信息,请阅读另一篇文章