git:追溯修复 CRLF 混乱

git: fix CRLF mess retroactively

提问人:sds 提问时间:8/23/2023 更新时间:9/16/2023 访问量:64

问:

我错误地提交了一些带有 CRLF 行结尾的文件。

现在我在本地设置并修复了文件(在编辑器中)。core.autocrlf = false

有没有办法解决这个问题(例如,使用 &c 的某种组合),以便 CRLF 从历史记录中永久消失?rebase -i

git 换行符 core.autocrlf

评论

2赞 Gunnar 8/23/2023
这似乎包含有用的提示,希望它有所帮助(另请参阅包含的“重新规范化”信息):aleksandrhovhannisyan.com/blog/...
0赞 DecimalTurn 8/25/2023
如果您使用 ,您始终可以将引入 CRLF 的提交与删除它们的提交一起压缩,之后历史记录中将不再有任何痕迹。rebase -i
0赞 sds 8/26/2023
@DecimalTurn:我怎么知道哪个提交引入了 CRLF?如果杀死 CRLF 的提交也在做其他事情怎么办?
0赞 DecimalTurn 8/26/2023
希望可能的提交列表不会太长,您可以使用此处的命令之一单独检查它们。一些 Git UI 工具还提供了在差异中查看行尾的可能性。
0赞 DecimalTurn 8/26/2023
关于“杀死 CRLF”的提交也在做其他事情的情况,这取决于。如果让每个提交只做一件事对你来说很重要,那么压缩是行不通的。您可以改为对引入 CRLF 的提交使用“edit”选项,并在编辑器中将 CRLF 替换为 LF(或者该命令也是一个选项)。但请注意,如果您在以后的提交中编辑了相同的行,则之后可能会有一些合并冲突需要解决。dos2unix <filename>

答:

1赞 VonC 9/10/2023 #1

我提到过:

使用 git rebase -x,您可以调用一个脚本,以确保应用本地 Git 配置。git add --renormalize .


Guildenstern 还在 git test fix 的评论中指出

该子命令可以运行格式化程序或 linter 等命令,并将其生成的更改应用于每个提供的提交。
例如:。
git test fixgit test fix --exec 'cargo fmt --all'

防止合并冲突

手动应用格式化程序或 linter 更改可能很困难(例如),因为它必然会重构固定提交的后代。
这通常会导致合并冲突,这些冲突将通过格式化或linting下一次提交来解决。(作为一种解决方法,有些人尝试以反向拓扑顺序修复提交,以最大程度地减少合并冲突的可能性。
git rebase --exec

git test fix从不产生合并冲突,因为它通过直接替换树 OID 来单独修复每个提交,并使后代提交保持不变。(您可以通过使用选项调用 git amend 来手动执行相同的操作)--reparent

在此处查看实际操作git test fix