我无意中更改了整个目录树的权限并将该更改与其他内容更改一起提交。
我使用类似如下的命令:
tar -czf deploy.tar git diff --name-only v1 v2
来生成一个包含两个标签之间修改的文件的 tar 文件,问题是现在由于权限更改,几乎所有目录树都被列为已修改。
有没有办法告诉 git diff
忽略那些只更改了权限的文件?
git config core.filemode false
gif diff -G.
结尾的点(.
)很重要。 - rodrigobb使用-G<regex>
选项("查找差异的补丁文本包含与<regex>
匹配的添加/删除行。")搜索任何更改 - 即 .
。仅包含权限更改的更改不会匹配此条件,因此它们将被忽略。
所以:git diff -G.
--ignore-space-at-eol
不兼容。如果我执行 git diff -G. revA..revB
,则可以抑制模式更改的报告,正如所需的那样,但我确实看到了行尾更改。如果我添加 --ignore-space-at-eol
,则可以抑制行尾更改,正如所需的那样,但是模式更改会重新出现。为什么会这样?在我看来,它们似乎并不根本相关。我想抑制两者。 - jez我在故意删除源代码文件(约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
如果需要重新尝试,可以使用类似的方法。
享受!