gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:27:26 25 4
gpt4 key购买 nike

我有一个简单(但希望能快速解决)的问题。我使用 msys/tortoiseGit 工具在 Windows 下创建了一个 git 存档。好的。现在,我将 repo 复制到 USB 内存棒,然后将其转移到 Linux 机器上。

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

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

因此:

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

最佳答案

  • 据我所知,除了重写存档之外。

  • 确保您的 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)

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


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

关于windows - 如何在 linux 下使用错误的字符集检查 git repo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com