我无意间更改了我整个树的权限,并将该更改与其他内容更改一起提交。
我用类似的东西:
tar -czf deploy.tar git diff --name-only v1 v2
要生成带有两个标签之间的已修改文件的tar,问题是现在由于权限更改,几乎所有我的树都被列为已修改。
有没有办法让我git diff
忽略那些只更改了权限的文件?
Answers:
这是一个古老的问题,答案已经在注释中,但是:
使用-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.
我故意从源代码文件(〜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或类似文件)。
请享用!