如何重新检出Git中的所有文件以从CRLF转换为LF?

14
我有一些使用CRLF换行符的文件。我更改了 git config --global core.autocrlf false。Git 没有检测到任何修改。当我编辑一个文件时,Git 认为整个文件都被更改了。如何重新检出并用 LF 覆盖所有文件,以便 diff 可以按预期工作?我看到了这个,但是答案引用了一个无效的命令。我还看到了这个,但是它说“Git 要提交您没有修改的文件”,这是不正确的。我尝试过
git pull --force
git checkout --force

然而,这些文件仍然有CRLF。我该如何将所有文件从CRLF转换为LF?我可以在Notepad ++中编辑每个文件,并使用编辑> EOL转换> Unix(LF)进行操作,这是我按文件逐个处理的方法,但这非常繁琐。可能还有一个awk或者sed脚本,但我不熟悉它们,我更愿意只修改被检入Git的内容,而不是弄乱.git/。


也尝试过:

git reset --hard origin/master

文件仍带有CRLF!


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


可能是Git拒绝重置/丢弃文件的重复问题。 - phd
不确定为什么您认为这是重复的。我提到了“Git没有看到任何修改”。我没有提交问题。而且,由于没有更改,也不应该有必要提交任何内容。只是想获取原始的LF行结尾。 - Chloe
那里的答案解释了如何使 git reset --hard 工作:首先使用 rm .git/index 或者用 git rm -r --cached . 清除索引。 - phd
最好使用“.giattributes”文件来指定文件行尾配置(这是解决问题的现代良好实践),以解决您的问题,并且它将为所有文件修复您的问题。 - Philippe
如果你使用的是Mac或Linux系统,你可以在目录中的每个文件上运行dos2unix。也许像perl这样的替代命令适用于你。 - Rory O'Kane
显示剩余2条评论
2个回答

20

这似乎有用,但我不确定为什么。看起来改动很多,让人感到很害怕,但最终并没有改变任何东西。在第一行之后,我开始感到担心。

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

无需提交任何更改。


2
只有当我使用 git reset --hard 时,这才对我起作用。我不需要在最后进行 checkout - joki
我需要执行 git rm --cached -r . && git reset --hard - jneira
我在最后确实需要了结帐,但我猜你的情况可能会有所不同。 - Shadow

2
"

git add --renormalize . 然后提交所有更改的文件对我有用。

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

--renormalize

重新应用“clean”过程到所有已跟踪的文件,以强制将它们再次添加到索引中。这在更改core.autocrlf配置或文本属性以纠正使用错误的CRLF/LF行结尾添加的文件时非常有用。此选项意味着-u。

"

1
虽然这段代码可能解决了 OP 的问题,但最好还是解释一下你的代码如何解决了 OP 的问题。这样,未来的访问者就可以从你的帖子中学习并应用到自己的代码中。SO 不是一个编码服务,而是一个知识资源。此外,高质量完备的答案更有可能被赞同。这些特点以及所有帖子都必须是自包含的要求构成了 SO 平台的一些优势,使其与论坛不同。你可以编辑以添加附加信息和/或使用源文档补充说明。 - SherylHohman

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