2

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

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

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

所以:

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

2 回答 2

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


刚刚找到了VonC的惊人答案:在 Windows 上,使用≥1.7.10,并修复现有存储库,有二进制文件(仅文件名,与上述不同)。msysgitrecodetree

于 2012-06-03T17:50:30.333 回答
0

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

于 2012-06-03T13:12:09.233 回答