换行符改为CR后,如何恢复Git文件的逐行Blame历史?
恢复换行符损坏文件的Git Blame作者信息
操作步骤
1. 定位正常提交并创建修复分支
找到换行符切换为CR前的最后一个正常提交(记为<good-commit>),基于该提交创建新分支用于修复:
git checkout -b fix-line-endings <good-commit>
2. 遍历损坏后的提交,逐个提取并应用真实变更
首先列出从第一个损坏提交(记为<bad-start-commit>)到当前主分支的所有提交,按时间正序排列:
git log --reverse <bad-start-commit>..main > commit-list.txt
然后逐个处理列表中的每个提交(以下操作针对单个目标文件filename):
- 导出当前提交中损坏的CR格式文件,转换为LF格式:
git show <commit-hash>:filename > temp_cr.txt tr '\r' '\n' < temp_cr.txt > temp_lf.txt - 对比当前分支的LF格式文件与转换后的文件,生成真实变更补丁:
diff -u filename temp_lf.txt > fix.patch - 若补丁存在有效变更,应用补丁到当前分支:
patch -p0 < fix.patch rm temp_cr.txt temp_lf.txt fix.patch - 使用原提交的作者信息提交变更:
git add filename git commit --author="$(git show --format="%an <%ae>" <commit-hash>)" --date="$(git show --format="%ad" <commit-hash>)" -m "$(git show --format="%s" <commit-hash>)"
3. 验证与收尾
完成所有提交处理后,用以下命令验证Blame信息是否恢复:
git blame filename
确认无误后,可将修复分支合并回主分支;若需替换原分支历史,需谨慎执行强制推送(需提前告知团队成员)。
注意事项
- 若多个文件出现换行符损坏,需调整步骤批量处理每个文件
- Windows环境建议使用Git Bash或WSL执行上述命令,确保
tr/diff/patch工具可用 - 操作前务必备份原分支,避免意外丢失历史
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

