线路结尾搞砸了Git - 如何在一个巨大的线路结束修复后跟踪另一个分支的变化?

keo*_*keo 24 git history rewrite branch newline

我们正在使用第三方PHP引擎来定期更新.这些版本保存在git中的一个单独的分支上,而我们的fork是主分支.

这样我们就可以从新版本的引擎中将补丁应用到我们的fork中.

我的问题是,经过对我们分支的许多提交后,我意识到引擎的初始导入是通过CRLF行结尾完成的.

我将每个文件转换为LF,但这做了一个巨大的提交,删除了100k行并添加了100k行,这显然打破了我们打算做的事情:从第三方引擎的工厂版本中轻松合并补丁.

我知道什么?我怎样才能解决这个问题?我的fork上已经有数百个提交.

最好的方法是在初始导入之后以及在分支我们自己的fork之前以某种方式执行行结束修复提交,并在历史记录中删除那个巨大的行结束提交.

但是我不知道如何在Git中这样做.

谢谢!

keo*_*keo 34

我终于设法解决了.

答案是:

git filter-branch --tree-filter '~/Scripts/fix-line-endings.sh' -- --all
Run Code Online (Sandbox Code Playgroud)

fix-line-endings.sh包含:

#!/bin/sh
find . -type f -a \( -name '*.tpl' -o -name '*.php' -o -name '*.js' -o -name '*.css' -o -name '*.sh' -o -name '*.txt' -iname '*.html' \) | xargs fromdos
Run Code Online (Sandbox Code Playgroud)

在所有提交的所有树中修复所有行结尾之后,我做了一个交互式rebase并删除了所有修复行结尾的提交.

现在我的回购清洁,新鲜,准备被推:)

访问者注意:如果您的仓库被推/克隆,请不要这样做,因为它会使事情变得非常糟糕!

  • 这太棒了!但是,您的脚本在文件名中存在空格问题。我做了这样的事情: find 。-type f -print0 -a \( -name '*.[hc]' -o -name '*.p[yl]' \) | xargs -0 fromdos (2认同)