有没有办法让git gui显示和显示UTF-16文件的差异?我找到了some information,但这主要是指命令行而不是GUI。
git gui
93ze6v8z1#
在msysGit人的帮助下,我一直在研究一个更好的解决方案,并提出了这个干净/污迹过滤器。过滤器使用Gnu file和iconv命令来确定文件的类型,并将其转换为msysGit的内部UTF-8格式。这种类型的清洁/涂抹过滤器给你更多的灵活性。它应该允许Git在大多数情况下将混合格式的文件视为UTF-8文本:diffs、merge、git-grep以及gitattributes属性,如eol-conversion、ident-replacement和内置的diff模式。上面概述的diff过滤器解决方案仅适用于diff,因此受到更多限制。要设置此筛选器,请执行以下操作:1.获取Gnu libiconv和file,并安装两者。1.确保GnuWin32\bin目录(通常是“C:\Program Files\GnuWin32\bin”)在%PATH%中。1.将以下内容添加到~\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
1.在全局~/Git/etc/gitattributes或本地~/.gitattributes中添加一行,以处理混合格式的文本,例如:
*.txt filter=mixedtext
我已经在一个包含ANSI、UTF-16和UTF-8格式的SQL文件的目录上使用了这个方法。到目前为止,它是有效的。除非有任何意外,这看起来像是20%的工作可以覆盖80%的Windows文本格式问题。
bd1hkmkf2#
此方法适用于MSysGit 1.8.1,并在Windows XP上进行了测试。我使用的是Git Extensions 2.44,但由于这些更改是在Git级别进行的,因此它们也应该适用于Git Gui。步骤:1.安装Gnu Iconv。1.创建以下脚本,将其命名为astextutf16,并将其放置在Git安装的/bin目录中(这是基于现有的astextplain脚本):
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
1.修改全局~/Git/etc/gitconfig或本地~/.git/config文件,并添加以下行:
[diff "astextutf16"] textconv = astextutf16
1.或者,从命令行:$ git config diff.astextutf16.textconv astextutf161.修改全局~/Git/etc/gitattributes或本地~/.gitattributes文件,并Map要转换的扩展名:*.txt diff=astextutf16
$ git config diff.astextutf16.textconv astextutf16
*.txt diff=astextutf16
eyh26e7m3#
我遇到了类似的问题。我想对公认的答案进行改进,因为它有一个小缺陷。我遇到的问题是,如果文件不存在,我会收到以下错误:
conversion to cannot unsupported
我更改了命令,因此不需要文件。它只使用标准输入和标准输出。这解决了问题。我的 .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必须做更多的工作(临时文件)。我们还将Git中的UTF-16 LE文件批量转换为UTF-8,因为这是最紧凑和可移植的UTF编码。在clean和smudge中使用的iconv命令非常适合永久转换文件。clean/smudge命令的好处是,即使文件是用UTF-16 LE签入的,diff仍然可以工作。
3条答案
按热度按时间93ze6v8z1#
在msysGit人的帮助下,我一直在研究一个更好的解决方案,并提出了这个干净/污迹过滤器。过滤器使用Gnu file和iconv命令来确定文件的类型,并将其转换为msysGit的内部UTF-8格式。
这种类型的清洁/涂抹过滤器给你更多的灵活性。它应该允许Git在大多数情况下将混合格式的文件视为UTF-8文本:diffs、merge、git-grep以及gitattributes属性,如eol-conversion、ident-replacement和内置的diff模式。
上面概述的diff过滤器解决方案仅适用于diff,因此受到更多限制。
要设置此筛选器,请执行以下操作:
1.获取Gnu libiconv和file,并安装两者。
1.确保GnuWin32\bin目录(通常是“C:\Program Files\GnuWin32\bin”)在%PATH%中。
1.将以下内容添加到~\Git\etc\gitconfig:
1.在全局~/Git/etc/gitattributes或本地~/.gitattributes中添加一行,以处理混合格式的文本,例如:
我已经在一个包含ANSI、UTF-16和UTF-8格式的SQL文件的目录上使用了这个方法。到目前为止,它是有效的。除非有任何意外,这看起来像是20%的工作可以覆盖80%的Windows文本格式问题。
bd1hkmkf2#
此方法适用于MSysGit 1.8.1,并在Windows XP上进行了测试。我使用的是Git Extensions 2.44,但由于这些更改是在Git级别进行的,因此它们也应该适用于Git Gui。步骤:
1.安装Gnu Iconv。
1.创建以下脚本,将其命名为
astextutf16
,并将其放置在Git安装的/bin目录中(这是基于现有的astextplain
脚本):1.修改全局~/Git/etc/gitconfig或本地~/.git/config文件,并添加以下行:
1.或者,从命令行:
$ git config diff.astextutf16.textconv astextutf16
1.修改全局~/Git/etc/gitattributes或本地~/.gitattributes文件,并Map要转换的扩展名:
*.txt diff=astextutf16
eyh26e7m3#
我遇到了类似的问题。
我想对公认的答案进行改进,因为它有一个小缺陷。我遇到的问题是,如果文件不存在,我会收到以下错误:
我更改了命令,因此不需要文件。它只使用标准输入和标准输出。这解决了问题。我的 .git/config 文件现在看起来像这样:
要在 .git/config 文件中创建条目,请使用以下命令:
我的.gitattributes文件看起来像这样:
仅指定可能是问题的文件,否则clean/smudge必须做更多的工作(临时文件)。
我们还将Git中的UTF-16 LE文件批量转换为UTF-8,因为这是最紧凑和可移植的UTF编码。在clean和smudge中使用的iconv命令非常适合永久转换文件。
clean/smudge命令的好处是,即使文件是用UTF-16 LE签入的,diff仍然可以工作。