【问题标题】:Can I make git diff ignore permission changes我可以让 git diff 忽略权限更改吗
【发布时间】:2011-03-18 11:00:19
【问题描述】:

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

我使用类似的东西:

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

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

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

【问题讨论】:

标签: git diff


【解决方案1】:

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

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

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

从你的工作目录的根目录。当然,请务必先复制您的 repo,即

cp -pr ~/repo.git ~/repo-orig.git

或类似的,以防您需要重试。

享受吧!

【讨论】:

【解决方案2】:

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

所以:git diff -G.

【讨论】:

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

这将告诉 git 忽略权限:

git config core.filemode false

【讨论】:

  • 也许这可能会阻止将具有更改权限的文件添加到提交中,但在我的情况下,文件已提交、推送和标记,您建议的命令对我没有帮助。我想我必须制作某种 bash 脚本来解析 git diff 的输出以删除有关模式更改的行,并将结果提供给 tar。任何想法都更受欢迎
  • @Cesar:该命令告诉 git 忽略索引和工作副本之间的权限差异。这不是你想要的吗?
  • @Cesar:哦!所以你已经提交了更改的权限?对不起,我错过了那部分。如果您尚未将更改推送到另一个存储库或将它们合并到另一个分支,我建议修改/重新设置提交以修复它。
  • gif diff -G.**matters** 末尾的点 (.)
猜你喜欢
  • 2014-04-18
  • 2017-10-28
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2012-04-08
  • 1970-01-01
相关资源
最近更新 更多