修正Git存储库中的行结尾是否会使未来的“差异”变得毫无用处

时间:2010-07-01 21:24:28

标签: svn git

所以我遇到了this issue。首先,GitHub page似乎表明这只会影响Windows机器。真的吗?我在OS X上对迁移的repo进行了新的克隆时遇到了问题。

其次,如果我执行此修复程序中的建议,我最终会修改数千个文件。问题是,当我查看分阶段更改的差异时,它似乎已经修改了整个文件。我的问题是:与之前的版本相比,这些文件的未来版本的所有差异都不会使修复行尾的提交无用吗?

请原谅我,如果这是一个特定于SVN的问题,但在SVN中这样的更改意味着当你试图对跨越修改了行结尾的提交的版本进行区分时,差异会显示整个文件发生了变化。 / p>

2 个答案:

答案 0 :(得分:1)

正如您所说,标准方法是创建一个新的提交来修复行结尾,从而更改每个文件的每一行。但是,由于您的是一个新迁移的repo,因此重写所有提交以在其中包含正确的行结尾可能更合适。您可以使用git rebasegit filter-branch执行此操作。使用rebase实现它本质上是一个手动过程,但filter-branch使用您提供的脚本。您的脚本可以对整个树执行任何操作,结果将保存为新版本的提交。

脚本的确切细节取决于您的具体情况,因为您不希望尝试更改二进制文件的行结尾。但是,如果您知道文件名模式,则可以使用find命令生成树中所有匹配文件的列表,并将其与xargs命令一起使用以运行fromdos在他们身上转换行结尾。例如:

#!/bin/sh
find . \( -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 fromdos

请注意,您必须为每次提交运行脚本,因为git存储整个文件,而不是差异。

请务必事先备份您的.git目录,以防万一出错!

答案 1 :(得分:0)

您可以使用此选项:

   -w, --ignore-all-space
       Ignore whitespace when comparing lines. This ignores differences
       even if one line has whitespace where the other line has none.