为啥在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改?

Posted

技术标签:

【中文标题】为啥在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改?【英文标题】:Why are changes indicated by Git after copying a repo between Windows and Linux machines?为什么在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改? 【发布时间】:2021-11-11 17:32:42 【问题描述】:

我在无法访问 Internet 的服务器上有一个项目存储库。我使用 WinSCP 将该存储库传输到我的 Windows 机器,然后拉取并推送到 GitHub。 在这一刻,当我执行“git status”时,一切都是干净且最新的。 然后,我使用 WinSCP 使用以下设置将此存储库复制回 Ubuntu 机器:

当我在 Ubuntu 机器上运行“git status”时。我看到工作目录中有6个文件被修改,正在等待添加到暂存区!!

在 Windows 上干净的存储库怎么可能在 Ubuntu 上不干净?可能与行尾有关吗?如果是,为什么它只发生在 50 个文件中的 6 个?

【问题讨论】:

有哪些变化?由于不同的编码或其他原因,可能只是空白字符。可以这么说,如果没有一个可以看到风景的房间,很难准确地说出什么。 您要解决什么实际问题?我可能只是重置这些文件并继续前进。 【参考方案1】:

感谢@isherwood。我刚刚检查了 git config,发现行尾不是由 git 自动管理的。

因此,我运行了以下命令,现在问题解决了:

git config --global core.autocrlf true

【讨论】:

我建议不要使用 autocrlf。这告诉 Git 猜测哪些文件是二进制文件,哪些是文本文件。 Git 会通常猜对,但你是否让你的狗驾驶你的车,因为他通常猜对转弯? :-) 如果我不使用autocrlf,那我应该用什么来解决我的问题? .gitattributes 文件的工作方式与.gitignore 文件类似,它让您可以根据文件名列出您希望对每个文件进行的任何特殊工作树修改。所以*.sh可以设置为eol=lf,而*.bat设置为eol=crlf,例如。【参考方案2】:

autocrlf 设置为所需的值:

autocrlf 的工作原理

core.autocrlf=true:    core.autocrlf=input:      core.autocrlf=false:
                                           
       repo                     repo                    repo
    /        \               /        \              /        \
crlf->lf    lf->crlf     crlf->lf       \          /            \      
 /              \        /                \      /                \

另一种展示 autocrlf 工作原理的方式

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x

【讨论】:

以上是关于为啥在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 LWJGL 仅在 Windows 上在以前和当前的游戏状态之间闪烁?

Windows与Linux之间的文件自动同步

小练习:用socket实现Linux和Windows之间的通信

为啥命名管道是本地的?

为啥在 Windows 上创建新进程比在 Linux 上更昂贵?

为啥 Linux 或 Windows 下的私钥字符串不同?