【问题标题】:How to checkout a git repo under linux with wrong charset?如何在 linux 下用错误的字符集签出 git repo?
【发布时间】:2012-06-03 13:06:22
【问题描述】:

我有一个简单(但希望可以快速解决)的问题。我使用 msys/tortoiseGit 工具在 windows 下创建了一个 git 存档。好的。现在我将 repo 复制到 U 盘上,然后将其传送到 linux 机器上。

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

当我现在在本地克隆 repo 时,变音符号被我的机器上无法显示的其他字符替换(导致 ?)。目前我无法访问 Windows 机器来修改任何内容。它也应该很快就能工作,因为我很快就无法再访问 Windows 机器了。

因此:

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

【问题讨论】:

  • 没有纯 linux 这样的东西,除非你指的是内核......
  • 你知道我的意思:基于 linux 的同构设置。没有 Windows 机器。

标签: windows linux git character-encoding


【解决方案1】:
  • 除了重写存档,我不知道。

  • 确保您的 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 命名空间中保留所有正引用(无论是否重写)的备份。


刚刚发现VonC 的惊人answer:在Windows 上,使用msysgit≥1.7.10,并修复现有存储库,有recodetree 二进制文件(仅文件名,与上述不同)。

【讨论】:

    【解决方案2】:

    Git 将文件存储为二进制 blob,因此您无法在不重写整个历史记录的情况下修复它。不是修改repo,而是修改文件。

    【讨论】:

    • 那么,什么...?我无法使用存档,并且将来我必须在所有这些存储库中使用 Windows?这看起来很糟糕!关于重写:如何做到这一点?过得去吗?
    猜你喜欢
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多