展示 Git 的差异,忽略文件权限的更改?

40

我曾在我的生产服务器上运行过几个chmod。现在当我在那里执行git diff时,我会看到很多old mode 100644 new mode 100755

我还更改了一些文件。但是我只想使用git diff来显示文件的更改,忽略文件权限的更改。

我该怎么办呢?顺便说一下,我不希望GIT忽略这些文件权限的更改。实际上,我想将它们提交,我只是想在一个非常特定的时刻不让git diff显示它们。


1
请您将下面的另一个答案标记为正确答案,而不是当前标记为正确答案的那个。当前标记为正确答案的那个显然是出于好意,但它做了与要求(“我只想让git diff在一个非常特定的时刻不显示它们。”)不同的事情,并且可能具有破坏性。谢谢。 - user82216
2个回答

95
git diff -G"."

-G 标志会过滤掉任何未添加或删除匹配正则表达式的行的文件。在本例中,提供的正则表达式是 ".",它匹配任何行。因此参数 -G"." 将过滤掉没有添加或删除行的文件。

您需要(我想)至少 Git 版本 1.7.10 才能使此方法工作。1.7.2 太旧了,至少需要更新到该版本。


1.7.9.5 似乎也太旧了 :( - ThorSummoner
20
"-G." 结尾的句号有重要意义,以防有人和我一样迟钝,认为那是一个句子的结尾。在添加/删除的行中,-G会寻找正则表达式(此处为“.”)。 - PseudoNoise
7
请注意,这实际上是一个很棒的技巧。默认情况下,git 会显示权限更改,而这个命令要求 git 只显示影响文件中至少一行的更改。这样做可以完成工作,因为仅更改权限不会影响任何行。那么对于二进制文件,以及当文件内容和权限都有更改时会发生什么呢? - Stéphane Gourichon
1
我认为这也将隐藏删除。 - Frank Robert Anderson
1
@FrankRobertAnderson 我现在正在使用它,但它并没有隐藏删除操作。 - Auspex
显示剩余5条评论

24

这将告诉git忽略权限:

git config core.filemode false

筛选在diff结果中的项目,但不忽略它们。

git filter-branch -f --tree-filter 'find * -type f | xargs chmod 644 ' -- --all

8
我不希望GIT忽略我的文件权限更改。我希望git diff不显示它们... - Hommer Smith
1
这些答案中有一个是解决方案吗?我认为我处于同样的情况,似乎这两个答案都忽略了与提交相关的权限,而不仅仅是查看已更改的文件。 - okwme
6
@HommerSmith,这应该符合你的需求: git -c core.fileMode=false diff致谢:https://dev59.com/ZXI-5IYBdhLWcg3w-92b#1580644 - saji89
3
“filter-branch” 会修改历史记录,这样做有些强硬。我希望初学者不要盲目地用它去改变项目的历史记录。与此同时,提问者补充道:“其实我想把它们提交,只是想让 git diff 在特定的时刻不显示它们。”因此,“filter-branch” 可能并不是他要求的东西。 - Stéphane Gourichon
2
OP不想让git忽略模式更改,他们只是不想在diff中看到它们。请参考Zed的答案作为正确答案。 - Frank Robert Anderson
显示剩余3条评论

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