我在一些自动化测试中使用 git 作为一种简单的方法,可以在 Linux 和 Windows 上使用相同的语法使用“diff”命令。它工作正常,但由于我要比较的文件位于共享驱动器上,我一直在偶然发现文件模式的差异被(不必要地)报告为更改。我环顾四周,发现在这种情况下建议使用 core.filemode 设置 - 但在我的实验中,在工作目录之外时似乎不会使用该设置。
这是我用于测试的 diff 命令:
git diff --ignore-space-at-eol --no-index createdFile expectedFile
输出:
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
按照建议,例如in this answer 。然而,输出仍然与上面相同(git 版本:2.25.1 - 也许这个文件模式实际上不起作用,正如 here 中以某种方式暗示的那样?)
全局设置 core.filemode
也不起作用。
我当前的解决方法是将“预期”文件复制到具有默认权限的 Linux 文件系统中的某个位置。如果可以避免这种情况就好了...
最佳答案
有一个解决方法:Show git diff, ignoring file permission changes? (Zed notes that git diff -G.
does the trick)。注意:-G.
中的点(句点)是此处的关键。仅模式 diff 没有 diff 文本,因此 .
无法匹配;所有其他差异确实有差异文本,即使它是纯粹的删除,因此 .
匹配某些内容,并且文件会显示。但这只是一种解决方法,而不是真正的解决方案。
要扩展一下我上面的评论:确实没有办法完全按照您想要的方式执行(除了暂时 chmod-ing 文件,或复制它们并 chmod-ing 副本)。
当您运行 git diff --no-index
(或任何隐含 --no-index
的 diff)时,Git 会调用 lstat
在每个文件上查找它是否是常规文件或目录以及其模式是什么。此电话来自 diff-no-index.c
around line 43 ,其最后几行包括:
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 位,因此当 trust_executable_bit
时,总是屏蔽 0111
可能就足够了> 是假的。
关于git - 如果 diff'ing 不在存储库中,则没有选项可以忽略文件模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70662799/