【问题标题】:git repo gives contradictory info from WSL than from Windowsgit repo 从 WSL 提供的信息比从 Windows 提供的信息相互矛盾
【发布时间】:2018-12-23 02:47:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我倾向于同意这几乎肯定与行尾/crlf 设置有关。 core.autocrlf 的设置是什么?
  • 在 powershell 端,它设置为 true。在 WSL 方面,它没有设置。

标签: git windows-subsystem-for-linux


【解决方案1】:

两个 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 环境中的 core.autocrlf 设置为 true 以模仿 Windows 的行为(因为 IDE 也在 Windows 中运行)。这也可能是一种选择。在一个新的系统上,从它开始关闭并且简单地使用 LF 可能会更好(并且每个 IDE 都支持),但我不想打扰现有的 repo...
  • 我用autocrlf:false,看我对this post的评论
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2011-05-29
    相关资源
    最近更新 更多