【发布时间】:2011-03-18 11:00:19
【问题描述】:
我无意中更改了整个树的权限,并将该更改与其他内容更改一起提交。
我使用类似的东西:
tar -czf deploy.tar git diff --name-only v1 v2
要在两个标签之间使用修改后的文件生成一个 tar,问题是现在由于权限更改,几乎我的所有树都被列为已修改。
有没有办法让git diff 忽略那些只更改了权限的文件?
【问题讨论】:
我无意中更改了整个树的权限,并将该更改与其他内容更改一起提交。
我使用类似的东西:
tar -czf deploy.tar git diff --name-only v1 v2
要在两个标签之间使用修改后的文件生成一个 tar,问题是现在由于权限更改,几乎我的所有树都被列为已修改。
有没有办法让git diff 忽略那些只更改了权限的文件?
【问题讨论】:
故意从源代码文件(约 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
或类似的,以防您需要重试。
享受吧!
【讨论】:
使用-G<regex> 选项(“查找补丁文本包含与<regex> 匹配的添加/删除行的差异。”)搜索所有更改 - 即.。仅限权限的更改与此不匹配,因此将被忽略。
所以:git diff -G.
【讨论】:
--ignore-space-at-eol 不兼容。如果我这样做git diff -G. revA..revB,那么我会根据需要抑制模式更改的报告,但我确实看到了行尾更改。如果我添加--ignore-space-at-eol,我会根据需要抑制行尾更改,但模式更改会回来。为什么会这样?对我来说,它们似乎没有根本的关系。我想抑制两者。
这将告诉 git 忽略权限:
git config core.filemode false
【讨论】:
git diff -G.(见stackoverflow.com/questions/22388811/…)
gif diff -G.**matters** 末尾的点 (.)