git gui
どういうわけかUTF16ファイルのdiffを表示および表示する方法はありますか?
いくつかの情報を見つけましたが、これは主にGUIではなくコマンドラインを参照しています。
私はmsysGitの人々の助けを借りて、はるかに優れたソリューションに取り組んでおり、このクリーン/スマッジフィルターを考え出しました。フィルタは、Gnuファイルとiconvコマンドを使用してファイルのタイプを判別し、msysGitの内部UTF-8形式との間で変換します。
このタイプのクリーン/スマッジフィルターは、はるかに柔軟性があります。これにより、Gitはほとんどの場合、混合形式のファイルをUTF-8テキストとして処理できるようになります。diff、merge、git-grep、およびeol-conversion、ident-replacement、組み込みのdiffパターンなどのgitattributesプロパティです。
上で概説したdiffフィルターソリューションはdiffに対してのみ機能するため、はるかに制限されています。
このフィルターを設定するには:
以下を〜\ 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
グローバル〜/ Git / etc / gitattributesまたはローカル〜/ .gitattributesに行を追加して、混合形式のテキストを処理します。次に例を示します。
*.txt filter=mixedtext
これは、ANSI、UTF-16、およびUTF-8形式のSQLファイルがあるディレクトリで使用しました。これまでのところ機能しています。驚きを除けば、これはすべてのWindowsテキスト形式の問題の80%をカバーできる20%の努力のように見えます。
このメソッドはMSysGit1.8.1用であり、WindowsXPでテストされています。私はGitExtensions2.44を使用していますが、変更はGitレベルで行われるため、GitGuiでも機能するはずです。手順:
GnuIconvをインストールします。
次のスクリプトを作成し、名前を付けて、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
グローバル〜/ Git / etc / gitconfigまたはローカル〜/ .git / configファイルを変更し、次の行を追加します。
[diff "astextutf16"]
textconv = astextutf16
または、コマンドラインから:
$ git config diff.astextutf16.textconv astextutf16
グローバル〜/ Git / etc / gitattributesまたはローカル〜/ .gitattributesファイルを変更し、変換する拡張機能をマップします。
*.txt diff=astextutf16
テスト。これで、UTF-16ファイルが表示されます。
私は同様の問題に遭遇しました。
小さなキズがあるので、受け入れられた答えを改善したいと思います。私が遭遇した問題は、ファイルが存在しない場合、次のエラーを受け取ったことです。
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が機能することです。