git - 如果 diff'ing 不在存储库中,则没有选项可以忽略文件模式吗?

标签 git testing

我在一些自动化测试中使用 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/

相关文章:

Gitolite:添加用户不起作用,并且在克隆为 root 时被 fallthru 拒绝?

reactjs - 通过开 Jest 模拟测试 axios 获取未定义

testing - 在测试中使用 fake-valid-nonce 创建交易时,交易结果显示消息 : "Gateway Rejected: duplicate”

java - 使用 Mockito 从链式方法中捕获参数

testing - 用于端到端集成测试的测试自动化框架

angular - 在单元测试 Angular 时测试 scrollintoview

git - 在没有读取权限的情况下忽略 git 子模块

python - 如何在命令行重新启动我的 Heroku Django 应用程序?

git - 连接后从代理收到 HTTP 代码 501

windows - Rebar get-deps 在 Windows 上不能很好地与 msysgit 1.7.4 配合使用