Git仓库在WSL和Windows上提供的信息不一致

34
当我通过WSL(Windows Subsystem for Linux)在Windows目录(/mnt/c/Users/....)上运行git status命令时,我发现目录中的每个文件都已被修改。每次修改都是对原始文件的删除和重写。如下图所示: enter image description here 以下是其中一个文件的git diff结果 git diff on specific file 现在,如果我在Windows端(通过powershell)上运行完全相同的存储库的git status命令,我将得到空白:

enter image description here

这是为什么呢?我知道^M与Linux和Microsoft使用的不同行尾有关,但是git会否认是否已进行更改似乎很奇怪。
注意:我一直通过存储库的单独克隆在WSL侧面工作(因此Windows侧面落后15个提交)。尽管没有对Windows存储库进行任何编辑,但我不确定是否会改变任何内容,但我认为我应该提到这一点。

1
我倾向于同意这几乎肯定与行尾/ crlf 设置有关。 core.autocrlf 的设置是什么? - Joe Hickey
在 PowerShell 方面,它被设置为 true。在 WSL 方面,它没有被设置。 - James Wright
2个回答

43
两个git安装(本机Windows和WSL)使用了不同的core.autocrlf配置设置,因为这两个安装程序没有使用相同的全局配置文件。简单来说,本机的Windows客户端在检出时将LF转换为CRLF,因此存在CRLF是不会被git status“看到”作为更改。相反,WSL客户端期望使用UNIX风格的LF行尾,因此git status将每个文件都视为已修改以将LF更改为CRLF。应该在存储库中本地设置core.autocrlf而不是依赖全局设置。如果从Linux/WSL和原生Windows两者访问同一存储库,则可能需要将其设置为false,以使git完全不改变任何行结尾。只需注意,如果您将其设置为false,则必须确保您的编辑器可以处理当前的行结尾(通常,我使用的大多数程序员编辑器都支持在Windows上使用UNIX LF)。有关更多信息,请参阅此处的core.autocrlf文档:https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_autocrlf

做得好,谢谢你 :) 我完全不知道这是一个问题... 这似乎有点愚蠢 :) - IncrediblePony
4
我已经在WSL环境中设置了core.autocrlftrue,以模仿Windows的行为(因为IDE也在Windows中运行)。这也许是一个选择。在全新的系统上,初始状态为“关闭”,简单地使用LF可能更好(每个IDE都支持它),但我不想干扰现有的存储库... - ZoolWay
我使用 autocrlf:false,请参考此帖子中的我的评论。 - Timo
我在想是否有可能根据文件路径自动设置这个?我希望在/mnt/c/下的所有存储库,即使在WSL中,也能自动使用Windows换行符,并且在WSL文件系统下的所有存储库都使用Unix换行符。 - Ryan McCampbell
在WSL和Windows之间创建一个符号链接是可能的:ln -s /mnt/c/users/USER/.gitfonig /home/USER/.gitconfig - undefined

6

这可能与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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接