3

git guiどういうわけかUTF16ファイルのdiffを表示および表示する方法はありますか?

いくつかの情報を見つけましたが、これは主にGUIではなくコマンドラインを参照しています。

4

3 に答える 3

5

私はmsysGitの人々の助けを借りて、はるかに優れたソリューションに取り組んでおり、このクリーン/スマッジフィルターを考え出しました。フィルタは、Gnuファイルとiconvコマンドを使用してファイルのタイプを判別し、msysGitの内部UTF-8形式との間で変換します。

このタイプのクリーン/スマッジフィルターは、はるかに柔軟性があります。これにより、Gitはほとんどの場合、混合形式のファイルをUTF-8テキストとして処理できるようになります。diff、merge、git-grep、およびeol-conversion、ident-replacement、組み込みのdiffパターンなどのgitattributesプロパティです。

上で概説したdiffフィルターソリューションはdiffに対してのみ機能するため、はるかに制限されています。

このフィルターを設定するには:

  1. Gnu libiconvfileを入手し、両方をインストールします。
  2. GnuWin32 \ binディレクトリ(通常は「C:\ ProgramFiles \ GnuWin32 \ bin」)が%PATH%にあることを確認します
  3. 以下を〜\ Git \ etc\gitconfigに追加します。

    [filter "mixedtext"]
        clean = iconv -sc -f $(file -b --mime-encoding %f) -t utf-8
        smudge = iconv -sc -f utf-8 -t $(file -b --mime-encoding %f)
        required
    
  4. グローバル〜/ Git / etc / gitattributesまたはローカル〜/ .gitattributesに行を追加して、混合形式のテキストを処理します。次に例を示します。

    *.txt filter=mixedtext
    

これは、ANSI、UTF-16、およびUTF-8形式のSQLファイルがあるディレクトリで使用しました。これまでのところ機能しています。驚きを除けば、これはすべてのWindowsテキスト形式の問題の80%をカバーできる20%の努力のように見えます。

于 2013-04-29T19:07:23.153 に答える
3

このメソッドはMSysGit1.8.1用であり、WindowsXPでテストされています。私はGitExtensions2.44を使用していますが、変更はGitレベルで行われるため、GitGuiでも機能するはずです。手順:

  1. GnuIconvをインストールします。

  2. 次のスクリプトを作成し、名前を付けて、Gitインストールの/ binディレクトリに配置します(これは既存のスクリプトastextutf16に基づいています)。astextplain

    #!/bin/sh -e
    # converts Windows Unicode (UTF-16 / UCS-2) to Git-friendly UTF-8
    # notes:
    # * requires Gnu iconv:
    #       http://gnuwin32.sourceforge.net/packages/libiconv.htm
    # * this script must be placed in: ~/Git/bin
    # * modify global ~/Git/etc/gitconfig or local ~/.git/config:
    #       [diff "astextutf16"]
    #           textconv = astextutf16
    # * or, from command line:
    #       $ git config diff.astextutf16.textconv astextutf16
    # * modify global ~/Git/etc/gitattributes or local ~/.gitattributes:
    #       *.txt diff=astextutf16
    if test "$#" != 1 ; then
        echo "Usage: astextutf16 <file>" 1>&2
        exit 1
    fi
    # -f(rom) utf-16 -t(o) utf-8
    "\Program Files\GnuWin32\bin\iconv.exe" -f utf-16 -t utf-8 "$1"
    exit 0
    
  3. グローバル〜/ Git / etc / gitconfigまたはローカル〜/ .git / configファイルを変更し、次の行を追加します。

    [diff "astextutf16"]  
        textconv = astextutf16
    
  4. または、コマンドラインから:

    $ git config diff.astextutf16.textconv astextutf16

  5. グローバル〜/ Git / etc / gitattributesまたはローカル〜/ .gitattributesファイルを変更し、変換する拡張機能をマップします。

    *.txt diff=astextutf16

  6. テスト。これで、UTF-16ファイルが表示されます。

于 2013-04-09T20:57:54.563 に答える
2

私は同様の問題に遭遇しました。

小さなキズがあるので、受け入れられた答えを改善したいと思います。私が遭遇した問題は、ファイルが存在しない場合、次のエラーを受け取ったことです。

conversion to cannot unsupported

ファイルが不要になるようにコマンドを変更しました。stdin/stdoutのみを使用します。これで問題が修正されました。私の.git/configファイルは次のようになります。

[filter "mixedtext"]
    clean = "GITTMP=$(mktemp);TYPE=$( tee $GITTMP|file -b --mime-encoding - ); cat $GITTMP | iconv -sc -f $TYPE -t utf-8; rm -f $GITTMP"
    smudge = "GITTMP=$(mktemp);TYPE=$( tee $GITTMP|file -b --mime-encoding - ); cat $GITTMP | iconv -sc -f utf-8 -t $TYPE; rm -f $GITTMP"
    required = true

.git / configファイルにエントリを作成するには、次のコマンドを使用します。

git config --replace-all filter.mixedtext.clean 'GITTMP=$(mktemp);TYPE=$( tee $GITTMP|file -b --mime-encoding - ); cat $GITTMP | iconv -sc -f $TYPE -t utf-8; rm -f $GITTMP'
git config --replace-all filter.mixedtext.smudge 'GITTMP=$(mktemp);TYPE=$( tee $GITTMP|file -b --mime-encoding - ); cat $GITTMP | iconv -sc -f utf-8 -t $TYPE; rm -f $GITTMP'
git config --replace-all filter.mixedtext.required true

私の.gitattributesファイルは次のようになります。

*.txt filter=mixedtext
*.ps1 filter=mixedtext
*.sql filter=mixedtext

問題になる可能性のあるファイルのみを指定してください。そうしないと、clean / smudgeがより多くの作業を行う必要があります(一時ファイル)。

また、これはUTFの最もコンパクトでポータブルなエンコーディングであるため、gitのUTF-16leファイルをUTF-8に一括変換しました。cleanとsmudgeで使用されるのと同じiconvコマンドは、ファイルを永続的に変換するのに最適でした。

clean / smudgeコマンドの良いところは、たとえばUTF-16leでファイルをチェックインした場合でも、diffが機能することです。

于 2016-02-06T03:52:41.980 に答える