29

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

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

现在使用iconvor之类的工具,recode我可以转换工作树中文件的编码。我可以用这样的消息来提交这个converted encoding

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

这可能吗(我不确定哈希码以及如何遍历提交、分支和标签)。或者有没有工具可以处理这样的事情?

4

1 回答 1

23

您可以使用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命令以编辑所有提交。

于 2012-06-15T15:32:31.730 回答