git gui -可以显示UTF-16吗?

5kgi1eie  于 2023-05-21  发布在  Git
关注(0)|答案(3)|浏览(165)

有没有办法让git gui显示和显示UTF-16文件的差异?
我找到了some information,但这主要是指命令行而不是GUI。

93ze6v8z

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 libiconvfile,并安装两者。
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文本格式问题。

bd1hkmkf

bd1hkmkf2#

此方法适用于MSysGit 1.8.1,并在Windows XP上进行了测试。我使用的是Git Extensions 2.44,但由于这些更改是在Git级别进行的,因此它们也应该适用于Git Gui。步骤:
1.安装Gnu Iconv
1.创建以下脚本,将其命名为astextutf16,并将其放置在Git安装的/bin目录中(这是基于现有的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 astextutf16
1.修改全局~/Git/etc/gitattributes或本地~/.gitattributes文件,并Map要转换的扩展名:
*.txt diff=astextutf16

  1. Test. UTF-16文件现在应该可见。
eyh26e7m

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仍然可以工作。

相关问题