from–https://qa.1r1g.com/sf/ask/729057031/
我试图db/irrelevant.php
从Git diff中排除一个文件().我试图把在一个文件db
名为的子目录.gitattributes
与行irrelevant.php -diff
,我也尝试创建一个名为.git/info/attributes
包含db/irrelevant.php
.
在所有情况下,该db/irrelevant.php
文件都作为Git二进制补丁包含在diff中.我想要的是diff命令忽略对该文件的更改.我究竟做错了什么?
Mr_*_*s_D 283
Omg,驱动程序和awk排除一个糟糕的文件?从git 1.9开始,您可以:
git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'
Run Code Online (Sandbox Code Playgroud)啊,优雅!请参阅@torek 的引用答案和详细解答
- 排除更多文件,例如我有*.min.css和*.min.js文件以避免git diff.所以,我使用命令`git diff – .’:(排除)*.min.js”:(排除)*.min.css’` (6认同)
- **windows语法**:`git diff – .”:(排除)db/irrelevant.php”`(双引号而不是单引号) (4认同)
- 谢谢!如此深奥的语法..我每次都要查一下。 (3认同)
- `git diff — 。’:(exclude)package-lock.json’` – 对于(可能)非常常见的情况,这里是复制粘贴的命令行。 (3认同)
- 注意:如果要排除特定的文件名,则必须以星号作为前缀,这与`.gitignore`文件语法不同。例如`:!* shrinkwrap.yaml`代替`:!shrinkwrap.yaml`。 (2认同)
- @cnlevy 或没有引号!`git diff — 。:(排除)db/irrelevant.php` (2认同)
- 是否可以添加这个 co .gitconfig 文件,以便 `git diff` 在默认情况下始终使用它运行? (2认同)
Kur*_*tal 61
您可以使用no op命令设置自定义diff驱动程序,并将其分配给应忽略的文件.
使用此命令创建特定于存储库的diff驱动程序
git config diff.nodiff.command /bin/true
Run Code Online (Sandbox Code Playgroud)或者你的所有回购--global
.
(如果/bin/true
在MacOS中不存在,替代品将使用/usr/bin/true
或echo
).
然后,将新的diff驱动程序分配给您要在.git/info/attributes
文件中忽略的文件.
irrelevant.php diff=nodiff
Run Code Online (Sandbox Code Playgroud)如果这个状态应该与其他开发人员共享,那么你可以使用.gitattributes
而不是与同伴.git/info/attributes
共享git config
命令(通过文档文件或其他东西).
- 这个答案对我来说效果更好:http://stackoverflow.com/questions/1016798/excluding-files-from-git-diff (11认同)
- 有趣的是,这种方法不适用于`git diff –stat`.在这种情况下,可以使用`git diff … | diffstat`作为解决方法. (3认同)
- 只是一个补充:如果你想强制git diff显示它,使用`–no-ext-diff` (3认同)
- 这正是我所寻找的 – 正如http://kerneltrap.org/mailarchive/git/2008/10/17/3711254所述我编辑了〜/ .gitconfig添加:`“command =/bin/true`然后我创建了一个名为.git/info/attributes的文件,我添加了:`irrelevant.php diff = nodiff` (2认同)
Szi*_*fer 34
您还可以使用patchutils程序集的filterdiff程序来排除diff的某些部分.例如:
git diff | filterdiff -p 1 -x db/irrelevant.php
Run Code Online (Sandbox Code Playgroud)
- 请注意,manpage(1)中的`-p`是”-pn,–strip-match = n匹配时,忽略路径名的前n个组件.” 我花了一段时间才发现`-p 1`正在从OP的路径中删除`db`部分.如果您只想指定文件名并忽略所有路径/目录的可能性,可以使用`-p 99`. (4认同)
dls*_*sso 33
最简单的答案
git diff ':!db/irrelevant.php'
它就':!<path to file>'
在您的 diff 命令之后。diff 命令可以像您喜欢的那样复杂,如果需要,您可以使用通配符*.min.js
或添加多个排除(空格分隔带引号的块)。
- 简短明确的答案。谢谢! (3认同)
- 谢谢!也适用于`git log -p`。如:`git log -p’:!package-lock.json’` (2认同)
Chi*_*nke 25
此方法比接受的答案短.
git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'
Run Code Online (Sandbox Code Playgroud)有关不同包含/排除可能性的更多信息,请阅读其他帖子
- 我会删除 –stat 部分,或者至少解释它的作用,因为其他答案都不包括它。 (6认同)
- 好的,我看到 “`git diff — ‘:!*.cs’ ‘:!*.js’ “` 谢谢 (2认同)
Ben*_*oux 17
这个单行解决方案不需要其他工具/下载:
git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`
Run Code Online (Sandbox Code Playgroud)file/to/exclude.txt
当然,您要排除的文件名称在哪里.
编辑:信用ksenzee修复已删除的文件打破差异.
jas*_*ard 11
相对于git根目录
git diff
接受一个可选的排除
git diff -- ":(exclude)thingToExclude"
Run Code Online (Sandbox Code Playgroud)
您可能想要添加一些通配符
git diff -- ":(exclude)*/thingToExclude/*"
Run Code Online (Sandbox Code Playgroud)
定位特定文件类型
git diff -- ":(exclude)*/$1/*.png"
Run Code Online (Sandbox Code Playgroud)
或者为您的 dotfiles 删除一个小脚本
比如.bash_profile
或.zshrc
gde() {
# git diff exclude files or folders
# usage:
# gde fileOrFolderNameToExclude
git diff -- ":(exclude)*/$1/*"
}
Run Code Online (Sandbox Code Playgroud)
use*_*608 10
KurzedMetal真的很好的回答我需要做什么,这是能够看到文件已经改变,但不能生成差异,这在我的情况下可能是巨大的.
但我的一位同事提出的方法更为简单,对我有用:
.gitattributes
在要忽略的文件所在的目录中添加文件,其中git diff
包含以下内容:
file-not-to-diff.bin -diff
仍然可以git status
“查看”文件是否更改.git diff
还会”看到”文件发生了变化,但它不会生成diff
.
这.bin
扩展了该示例中的文件是经过深思熟虑的.我确实知道这是二进制文件的git的默认行为,它不需要特殊处理.gitattributes
.但在我的情况下,这些文件被git和”file”实用程序识别为文本文件,这就是诀窍.
- 这应该是公认的答案。 (3认同)
- 是的!这很整洁,它不会隐藏任何更改,但不会向您显示丑陋的 `*.min.js` 文件等。这很好,最好的答案恕我直言。 (2认同)
- 它确实应该:没有人希望每次“git diff”时都必须输入一堆参数。此解决方案可让您修复一次并永远忘记该问题。 (2认同)