我在一些自动化测试中使用 git 作为一种在 Linux 和 Windows 上使用相同语法的“diff”命令的简单方法。它工作正常,但由于我正在比较的文件位于共享驱动器上,我一直在偶然发现文件模式的差异被(不必要地)报告为更改。我环顾四周,发现core.filemode
在这种情况下推荐设置 - 但在我的实验中,在工作目录之外时似乎不会使用该设置。
这是我用于测试的 diff 命令:
git diff --ignore-space-at-eol --no-index createdFile expectedFile
Output:
diff --git a/createdFile b/expectedFile
old mode 100644
new mode 100755
(我想忽略文件模式的差异)。
我尝试过的:
git -c core.filemode=false diff --ignore-space-at-eol --no-index createdFile expectedFile
正如所建议的,例如在这个答案中。然而,输出仍然与上面相同(git版本:2.25.1 - 也许这个文件模式实际上在那里不起作用,正如其中暗示的那样here?)
环境core.filemode
全球范围内也不起作用。
我当前的解决方法是将“预期”文件复制到具有默认权限的 Linux 文件系统中的某个位置。如果可以避免这种情况就好了……
有一个解决方法: 显示 git diff,忽略文件权限更改? (泽德指出git diff -G.成功了)。注意:中的点(句号)-G.
是这里的关键。仅模式差异没有差异文本,因此.
匹配失败;所有其他差异确实有差异文本,即使它是纯粹的删除,所以.
匹配某些内容,然后显示文件。但这只是一种解决方法,而不是真正的解决方案。
要扩展一下我上面的评论:确实没有办法完全按照您想要的方式执行(除了暂时 chmod-ing 文件,或复制它们并 chmod-ing 副本)。
当你跑步时git diff --no-index
(或任何差异--no-index
是隐含的),Git 调用lstat
在每个文件上查明它是否是常规文件或目录以及其模式是什么。这个电话是从diff-no-index.c43号线附近,其最后几行包括:
else
*mode = st.st_mode;
这假设操作系统,无论它是什么,都会产生持续的 st_mode
可执行位,即使它们不可信。
为了使这个遵守core.filemode
设置,最后一行可能需要阅读,例如:
*mode = !S_IFREG(st.st_mode) || trust_executable_bit ?
st.st_mode : st.st_mode & ~0111;
例如。这也许可以简化:我认为 Git 不关心x
目录上的位,所以总是屏蔽掉0111
可能就足够了,当trust_executable_bit
是假的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)