排除某些文件和文件夹的git diff命令

5
我目前使用以下git diff 命令获取文件更改列表,我想要排除某些文件夹(如datafiles)和文件(.DSstore),请问是否有方法可以实现?
git diff --no-index /Users/USERNAME/Documents/FWintegration/ingo2/ukon_4355c1 /Users/USERNAME/Documents/FWintegration/ingo2mirror/ingo2mirror

而且...我刚意识到,我的两个答案都带有“--noindex”选项,真是太傻了。 - zzxyz
尽管git diff --stat可能有所帮助,但具体取决于您的要求。 - Paul Hicks
@PaulHicks 我不确定在这种情况下 git 是否是一个好工具,现在我已经看了 "--no-index"。也许会有一些 git 专家来教育我。我肯定不是其中之一。 - zzxyz
1
它正在比较两个文件,其中至少一个文件不在版本控制中。find+diff / ack / ag等工具可能更加适合。 - Paul Hicks
1
@user3682248 - 如果我理解文档正确的话,“--no-index”明确要求版本控制系统不使用版本控制信息。我会将其比作使用Netbeans或Visual Studio编辑文本文件。这并没有什么问题,但可能有更好的工具来完成这项工作。 - zzxyz
显示剩余3条评论
2个回答

3

好的...这是我的第三个答案。不幸的是,这个答案是最复杂的,但它实际上可以使用--no-index来工作:

git diff | awk '{if (/^diff --git/) {if (/d1\/\S*$/){display=0}else{display=1}};if (display==1) {print}}'

每个文件差异 `git diff` 的执行都以 "diff --git" 开始。 因此,我们使用 awk 查找该行。 如果它找到了它,但不喜欢它,它就停止打印,直到找到一个喜欢的 diff --git。
因此,您修改的仅是 awk 语句的一部分 `if (/d1\/\S*$/)`,它是如何过滤的...如果此正则表达式匹配,则会忽略此 diff--不打印它。 这将过滤掉“d1 /”后跟任意数量的非空格字符,直到行末(因此它只查看第二个文件名而不是第一个)。 对于您的示例,if 应该是:
if (/datafiles\/\S*$/ || /\.DSstore$/)

编辑: 如果这对你来说太疯狂了,而且没有人提供更好的解决方案,我强烈建议您查看“Beyond Compare”,这是一个功能强大的目录/文件比较工具,具有良好的用户界面。


是的!这确实可以使用--no-index。不幸的是,它会删除git diff行的颜色编码。有什么办法可以保留它吗? - VictorB

3
git diff -- ':!unwantedpath'

例如,git diff -- ':!foo/bar/datafiles' ':!*.DSstore'
但这是一个相对较新的功能,仅在使用新版本的 Git 时才能正常工作。我不记得它是在哪个版本中引入的,但应该是在2.10.0版本之后的某个版本。

2
这个比我的答案好多了,但是没有那么搞笑。 - zzxyz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接