【问题标题】:How do I re-checkout all files in Git to convert from CRLF to LF?如何重新签出 Git 中的所有文件以从 CRLF 转换为 LF?
【发布时间】:2018-05-15 15:44:54
【问题描述】:

我已使用 CRLF 签出文件。我更改了git config --global core.autocrlf false。 Git 没有看到任何修改。当我编辑一个文件时,Git 认为整个文件都改变了。如何使用 LF 而不是 CRLF 重新签出并覆盖所有文件,以便差异按预期工作?我看到了this,但答案提到了一个无效的命令。我看到了this,但它说“Git 想要提交您尚未修改的文件”,这是不正确的。我试过了

git pull --force
git checkout --force

但是文件仍然有 CRLF。那么如何将所有文件从 CRLF 转换为 LF?我可以在 Notepad++ 中编辑每个文件并使用 Edit > EOL Conversions > Unix (LF),这是我在逐个文件的基础上一直在做的事情,但这非常乏味。可能还有一个awksed 脚​​本,但我不熟悉它们,我宁愿只修改签入Git 的内容,而不是搞砸.git/


也试过了

git reset --hard origin/master

并且文件仍然带有 CRLF!


这不是建议副本的副本,因为我不想提交任何内容。只想从 Git 获取新副本。此外,Git 没有看到任何文件被修改。

【问题讨论】:

  • 不知道为什么你认为这是重复的。我提到“Git 没有看到任何修改”。我提交没有问题。并且没有必要提交任何东西,因为没有任何改变。仅寻求获取原始 LF 行结尾。
  • 那里的答案解释了如何使git reset --hard 工作:首先使用rm .git/index 删除索引或使用git rm -r --cached . 清除它
  • 您最好通过使用“.giattributes”文件来指定文件行尾配置来解决您的问题(这是当今解决您问题的好习惯),它将解决您的问题你所有的文件。
  • 我的文件真的没有问题。它设置为true,Git 忠实地将 LF 转换为 CRLF。但我想将其设置为false,然后只获取文件的新副本而不进行任何转换,因为我的编辑器可以处理 LF。如果有人签入 CRLF 文件,我不一定要将其转换为 LF - 我只想查看 Git 中文件的原始二进制版本。 CRLF 也很好,如果在 Git 中就是这样的话。

标签: git


【解决方案1】:

这似乎有效,但我不知道为什么。它看起来非常可怕,有很多变化,但最终什么都没改变。第一行后我很担心。

git rm --cached -r .
git reset
git checkout .

无需提交。

【讨论】:

  • 这仅在我使用git reset --hard 时对我有效。最后我不需要checkout
  • 我需要git rm --cached -r . && git reset --hard
【解决方案2】:

git add --renormalize . 然后提交所有更改的文件为我做了这件事。

根据man git add,它特别提到在core.autocrlf 更改之后运行它。

--重新归一化

对所有跟踪的文件重新应用“清理”过程,以强制将它们再次添加到索引中。这在更改 core.autocrlf 配置或 text 属性后很有用,以便更正添加了错误 CRLF/LF 行结尾的文件。该选项隐含 -u。

【讨论】:

  • 虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。这样,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能得到支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
相关资源
最近更新 更多