如何用错误的字符集检查linux下的git repo?

时间:2012-06-03 13:06:23

标签: windows linux git character-encoding

我有一个简单的(但希望快速解决)问题。我使用msys / tortoiseGit工具在windows下创建了一个git存档。行。现在我将repo复制到USB记忆棒并将其转移到linux机器上。

不幸的是,repo中的文件包含德语变音符号等(äöüß)。在纯窗口下没有问题,我知道在纯Linux下也没有问题。

当我现在在本地克隆repo时,变音符号会被我的机器上无法显示的其他字符替换(导致?)。目前我无法到达Windows机器修改任何东西。此外它应该很快就会工作,因为我将无法再访问Windows机器。

因此:

  • 我可以(以某种方式)修改存档以确保正确的字符集吗?
  • 创建新档案时可以避免这种情况吗?
  • 我可以(只使用linux)克隆它透明工作的repo suh吗?
  • [edit]如何重新使用repo,以便(至少)文件名进入正确的字符集?

2 个答案:

答案 0 :(得分:2)

  • 除了重写档案外,不是我所知道的。

  • 确保您的Windows编辑器使用UTF-8而不是本地代码页。
    见下文。

  • 您的Linux可能附带非UTF-8语言环境。在某种程度上,

    LANG=de_DE.iso88591@euro
    

    将请求您的程序以相同的编码进行读写。但是,这不是一个完整的解决方案;例如,无论内容编码如何,Gtk +都假定文件名为UTF-8。

  • 重写Git仓库的常用方法是使用git-filter-branch。这是我刚刚制作的一个例子,它应该重新编码文件名,文件内容和从ISO-8859-1到UTF-8的提交消息。

    CONVERT='iconv -fiso8859-1 -tutf-8'
    git filter-branch \
        --index-filter '
            git ls-files -z --stage |
            while read -d "" mode ref stage name; do
                [[ "$stage" = 0 || "$stage" = 1 ]] &&
                printf "0 0000000000000000000000000000000000000000\t%s\0" "$name"
                newname="$(echo "$name" | '"$CONVERT'")"
                newref="$(
                    git cat-file blob "$ref" |
                    '"$CONVERT"' |
                    git hash-object -w --stdin)"
                printf "%s %s %s\t%s\0" "$mode" "$newref" "$stage" "$newname"
            done |
            git update-index -z --index-info' \
        --msg-filter "$CONVERT" \
        $(git for-each-ref --format='%(refname)' refs/heads refs/tags)
    

    小心:我没有在合并或二进制文件存在的情况下对此进行测试,并且使用git-filter-branch很容易破坏大量历史记录。如果出现问题,git会保留refs/original名称空间中所有正面引用(已重写或未重写)的备份。


answer之前找到一个惊人的VonC:在Windows上,使用msysgit≥1.7.10,并修复现有的存储库,有recodetree二进制文件(文件名)只是,不像上面那样。)

答案 1 :(得分:0)

Git将文件存储为二进制blob,因此如果不重写整个历史记录,则无法修复它。它不是修改仓库,而是修改文件。