git - 转换git仓库文件编码

标签 git utf-8 character-encoding cvs cvs2svn

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

当然,我可以将 git 配置为使用 ISO-8859-1 进行编码,但我想使用 utf8

现在,借助 iconvrecode 等工具,我可以转换工作树中文件的编码。我可以使用类似 converted encoding 的消息来提交它。

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

这可能吗(我不确定哈希码以及如何遍历提交、分支和标签)。或者是否有可以处理此类问题的工具?

最佳答案

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

关于git - 转换git仓库文件编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11052199/

相关文章:

c++ - 使用 C++(无 winapi)将 UTF-8 字符转换为最接近的等效 ASCII 字符

c - 为什么这些字符常量具有负值?

c# - 撇号通过 C# 中的过滤器

node.js - 无法从 travis 发布到 github 包注册表 : 401 unauthorized despite including github personal access token

Git 非快进被拒绝

git - 尽管有 svn copy,如何 git svn clone 完整的历史记录

java - 如何强制 javax xslt 转换器使用 utf-8 而不是 html 实体对国家字符进行编码?

python - UTF8编码的字符串'Jalape\xc3\xb1o'('Jalapeño')是否包含8或9个字符?

git - 删除所有不在 master 上添加差异的 git 分支

c++ - 在 C++ 中使用 std::ifstream 读取 ASCII 文本文件