转换git存储库文件编码

时间:2012-06-15 14:05:32

标签: git utf-8 character-encoding cvs cvs2svn

我有一个包含ISO-8859-1中文件的大型CVS存储库,并希望将其转换为git。

当然,我可以将git配置为使用ISO-8859-1进行编码,但我希望将其放在utf8中。

现在使用iconvrecode等工具,我可以转换工作树中文件的编码。我可以使用converted encoding等消息提交此内容。

我现在的问题是,是否有可能转换完整的历史记录?从cvs转换为git或之后。我的想法是编写一个脚本来读取git存储库中的每个提交并将其转换为utf8并将其提交到新的git存储库中。

这是否可行(我不确定哈希码以及如何遍历提交,分支和标签)。还是有一种工具可以处理这样的事情吗?

1 个答案:

答案 0 :(得分:19)

您可以使用git filter-branch执行此操作。我们的想法是你必须在每次提交时更改文件的编码,然后在你去的时候重写每个提交。

首先,编写一个脚本来更改存储库中每个文件的编码。它看起来像这样:

#!/bin/sh

find . -type f -print | while read f; do
        mv -i "$f" "$f.recode.$$"
        iconv -f iso-8859-1 -t utf-8 < "$f.recode.$$" > "$f"
        rm -f "$f.recode.$$"
done

然后使用git filter-branch一次又一次地运行此脚本,每次提交一次:

git filter-branch --tree-filter /tmp/recode-all-files HEAD

其中/tmp/recode-all-files是上述脚本。

在从CVS新升级存储库之后,您可能在git中只有一个分支,其线性历史记录回到开头。如果您有多个分支,则可能需要增强git filter-branch命令来编辑所有提交。