转换git存储库文件编码

Ber*_*ach 26 git cvs utf-8 cvs2svn character-encoding

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

当然我可以配置git ISO-8859-1用于编码,但我想有它utf8.

现在有了这样的工具,iconv或者recode我可以转换工作树中文件的编码.我可以用这样的消息来提交converted encoding.

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

这是可能的(我不确定哈希码以及如何遍历提交,分支和标签).或者是否有一个工具可以处理这样的事情?

Cel*_*ada 20

你可以这样做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
Run Code Online (Sandbox Code Playgroud)

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

git filter-branch --tree-filter /tmp/recode-all-files HEAD
Run Code Online (Sandbox Code Playgroud)

/tmp/recode-all-files上面的脚本在哪里.

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

  • 如果您在提交消息中也使用了ISO-8859-1字符,您也可以转换它们:`git filter-branch --msg-filter'iconv -f iso-8859-1 -t utf-8' - - -all` (2认同)