git 回购从 WSL 提供的信息与 Windows 提供的信息相互矛盾

git repo gives contradictory info from WSL than from Windows

当我通过 Window 上的 WSL(Windows Linux 的子系统)在 git 存储库上 运行 git status 时' s 目录 (/mnt/c/Users/....),我知道目录中的每个文件都已被修改。每次修改只是对原文件的删除和重写。见下文:

下面是其中一个文件的 git diff

现在,如果我 运行 在 Windows 端(通过 powershell)的完全相同的存储库上 git status,我什么也得不到:

这背后有什么特别的原因吗?我知道 ^M 与 Linux 和 Microsoft 使用的不同行尾有关,但是 git 不同意是否进行了更改对我来说似乎很奇怪。

注意:我一直在通过存储库的单独克隆在 WSL 端处理存储库(因此 Windows 端落后 15 次提交)。但是,Windows 存储库没有进行任何编辑。不确定这是否会改变什么,但我想我会提到它。

两个 git 安装(本机 windows 和 WSL)对 core.autocrlf 配置使用不同的设置,因为这两个安装没有使用相同的全局配置文件。

简而言之,本机 windows 客户端在结帐时将 LF 转换为 CRLF,因此 git status 不会将 CRLF 的存在“视为”更改。相反,WSL 客户端需要 UNIX 样式的 LF 行结尾,因此 git status 将每个文件视为已修改以将 LF 更改为 CRLF。

而不是依赖全局设置 core.autocrlf 您应该在任何共享存储库的存储库中本地设置它。如果从 Linux/WSL 和本机 Windows 访问同一个存储库,您可能希望将此设置为 false,这样 git 根本不会更改任何行结尾。请注意,如果您确实将其设置为 false,则必须确保您的编辑器可以按原样处理行尾(一般来说,我使用过的大多数程序员编辑器都支持使用 UNIX LF,即使在 Windows).

此处记录了 core.autocrlf 以获取更多信息:

https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_autocrlf

这可能与 WSL 报告 Windows 文件系统上所有文件的权限为 777 有关。Git 然后将所有文件视为已更改,因为它们的权限不同。

尝试更改 Git 配置以便忽略权限更改:

# For the current repository
git config core.filemode false   

# Globally
git config --global core.filemode false

参见:https://github.com/microsoft/WSL/issues/184