2

単純な(ただし、迅速に解決できることを願っています)問題があります。msys/tortoiseGit ツールを使用して、Windows で git アーカイブを作成しました。わかった。次に、レポを USB スティックにコピーし、Linux マシンに渡しました。

残念ながら、レポにはドイツ語のウムラウトなどを含むファイルがあります ( äöüß)。純粋な Windows では問題はありません。また、純粋な Linux では問題がないこともわかっています。

リポジトリをローカルに複製すると、ウムラウトは自分のマシンでは表示できない他の文字に置き換えられます (結果は a になります?)。現時点では、何かを変更するために Windows マシンにアクセスできません。また、Windowsマシンにすぐにアクセスできなくなるため、すぐに機能するはずです。

したがって:

  • 正しい文字セットを確保するためにアーカイブを (どういうわけか) 変更できますか?
  • 新しいアーカイブを作成するときに、この状況を回避できますか?
  • (Linux のみを使用して) レポを複製して透過的に動作させることはできますか?
  • [編集] (少なくとも) ファイル名が正しい文字セットになるようにリポジトリを書き換える方法は?
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 として保存するため、履歴全体を書き換えずに修正することはできません。リポジトリの変更ではなく、ファイルの変更です。

于 2012-06-03T13:12:09.233 に答える