我有一个包含ISO-8859-1
中文件的大型CVS存储库,并希望将其转换为git。
当然,我可以将git配置为使用ISO-8859-1
进行编码,但我希望将其放在utf8
中。
现在使用iconv
或recode
等工具,我可以转换工作树中文件的编码。我可以使用converted encoding
等消息提交此内容。
我现在的问题是,是否有可能转换完整的历史记录?从cvs转换为git或之后。我的想法是编写一个脚本来读取git存储库中的每个提交并将其转换为utf8
并将其提交到新的git存储库中。
这是否可行(我不确定哈希码以及如何遍历提交,分支和标签)。还是有一种工具可以处理这样的事情吗?
答案 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
命令来编辑所有提交。