我在 Windows 上并且在系统范围内拥有core.autocrlf=true.
对于特定的存储库,我已在本地将其覆盖为false.
但这并没有转换签出文件中的行尾。我怎么做?
dos2unix,它们会显示为已更改。git checkout --force HEAD,没有效果。我发现的唯一有效方法是删除所有文件,然后git reset --hard这很尴尬(=没有简单可靠的命令可以做到这一点,而且它做了很多不必要的工作——一切都是从头开始重新创建的,而不仅仅是覆盖需要转换的文件)。
我有一个只能在 Windows 上使用的存储库。而且我希望源代码管理不会以任何方式修改我的文件的内容。
我core.autocrlf在全局设置中设置为 false 并验证不存在本地回购覆盖。我发现我的 repo 中有一个现有的 .gitattributes 文件,* text=auto它是唯一的条目。所以我删除了 .gitattributes 文件。通过阅读文档,我的理解是这应该导致text未指定,并将遵循为core.autocrlf.
但是,当我暂存我的文件时,我仍然收到以下错误:
LF will be replaced by CRLF in MyProject/src/static/images/logo.svg.
The file will have its original line endings in your working directory.
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,有些东西仍然会修改我的文件。它是什么,我该如何阻止它?
我有一个 repo,其中包含一个错误地以 LF 行结尾提交的文件,但它需要有 CRLF 行结尾。为了解决这个问题,我添加了一个 .gitattributes 文件以在结帐时强制执行正确的行结尾,这似乎解决了检出新存储库时的问题,但现有的检出拒绝更新文件,除非我删除文件然后重新检出. 我在另一个问题中看到
git rm --cached -r .
git reset
git checkout .
Run Code Online (Sandbox Code Playgroud)
将正确地将受影响文件的行尾从 CRLF 重置为 LF,但这似乎不适用于 LF 到 CRLF。如何让 Git 自动应用 .gitattributes 中的更改?
在本地建立的任意Git项目中,.gitattribute根目录下可以包含一个文件来根据环境控制特殊字符(以GitHub上的Apache Spark为例):
*.bat text eol=crlf
*.cmd text eol=crlf
*.java text eol=lf
*.scala text eol=lf
*.xml text eol=lf
*.py text eol=lf
*.R text eol=lf
Run Code Online (Sandbox Code Playgroud)
Git 仅在提交新文件时使用此文件,这可能会导致许多碎片提交,这些提交不会更改除特殊字符(特别是行分隔符)之外的文件内容。
我可以使用哪一个 Git 命令一次性修改项目下的所有文件,无论是否提交?
我的问题可能来自于对 Git 某些方面的误解。当我因 Windows 机器上的更改而在 Mac 上将 CRLF 更改为 LF 行结尾时,我想到了这个问题。
1) 我首先在 OSX 上初始化一个新存储库,并将所有文件放入受 CRLF 行结尾影响的文件中。
2)第一次提交,由于设置了 core.autocrlf = input ,git 自动将行结尾更改为 LF
我的本地工作树中的文件仍然具有 CRLF 行结尾,但这里也提供了解决方案(How to Normalizeworking tree lineendings in Git?):
删除Index中的文件,并根据上次commit恢复索引+工作树:
git rm --cached -r .
git reset --hard
Run Code Online (Sandbox Code Playgroud)
现在出现了混乱:我的第一个提交 1) 包含转换后的 LF 行结尾,而我的本地树和索引则不包含。因此,我的期望是 git 应该显示工作树/索引和存储库之间的差异。但
git diff HEAD
git diff --chached
Run Code Online (Sandbox Code Playgroud)
没有列出任何更改?