我可以让git diff忽略权限更改吗


71

我无意间更改了我整个树的权限,并将该更改与其他内容更改一起提交。

我用类似的东西:

tar -czf deploy.tar git diff --name-only v1 v2

要生成带有两个标签之间的已修改文件的tar,问题是现在由于权限更改,几乎所有我的树都被列为已修改。

有没有办法让我git diff忽略那些只更改了权限的文件?


Answers:


17

这是一个古老的问题,答案已经在注释中,但是:

使用-G<regex>选项(“查找其补丁程序文本包含与之匹配的添加/删除的行的差异<regex>。”)完全搜索任何更改,即.。仅限权限的更改与此不匹配,因此将被忽略。

所以: git diff -G.


由于某种原因,此解决方案与兼容--ignore-space-at-eol。如果我这样做了,git diff -G. revA..revB那么我会根据需要禁止报告模式更改,但是我确实看到行尾更改。如果添加,--ignore-space-at-eol我会根据需要抑制行尾更改,但是模式更改会回来。为什么会这样呢?对我来说,它们似乎根本不相关。我想压制两者。
jez

153

这将告诉git忽略权限:

git config core.filemode false

2
也许这可以防止将具有更改权限的文件添加到提交中,但是在我的情况下,文件已提交,推送和标记,并且您提出的命令对我没有帮助。我猜我将不得不制作某种bash脚本来解析git diff的输出,以删除有关模式更改的行,并将结果提供给tar。任何想法都将受到欢迎
Cesar

@Cesar:该命令告诉git忽略索引和工作副本之间的权限差异。那不是你想要的吗?
丹尼尔·斯图茨巴赫

3
@Cesar:哦!因此,您已经提交了更改的权限?抱歉,我错过了那部分。如果您尚未将更改推送到另一个存储库或将其合并到另一个分支,则建议修改/调整提交以对其进行修复。
丹尼尔·斯图兹巴赫


2
**事项**.末尾的点()gif diff -G.
rodrigobb

12

我故意从源代码文件(〜26K文件)中删除了执行权限后遇到了这个问题。然后,git diff说所有文件都变了!core.filemode的答案对我没有帮助,因为那只会影响与您的工作目录有关的差异,而不影响与存储库中的2次提交有关的差异。

答案是使用(大吓人)filter-branch命令。特别是,您需要输入的只是:

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

从工作目录的根目录开始。当然,如果需要重试,请务必先制作一份您的存储库副本(cp -pr〜/ repo.git〜/ repo-orig.git或类似文件)。

请享用!


1
有趣的(+1)。我已将其包含在我的答案中stackoverflow.com/a/12979453/6309(因为您自己的答案已删除)
VonC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.