有什么办法 git gui 显示和显示UTF16文件的差异?

我发现 一些信息, ,但这主要是指命令行,而不是GUI。

有帮助吗?

解决方案

我一直在研究 很多 在Msysgit人员的帮助下更好的解决方案,并提出了这种干净/污迹过滤器。该过滤器使用GNU文件和ICONV命令来确定文件的类型,并将其沿MSYSGIT的内部UTF-8格式转换。

这种干净/污迹过滤器可为您提供更大的灵活性。在大多数情况下,它应该允许Git将您的混合格式文件视为UTF-8文本:diff,Merge,git-grep以及gitattributes属性,例如EOL转换,识别替代和内置的差异模式。

上面概述的DIFF滤波器解决方案仅适用于差异,因此更加有限。

设置此过滤器:

  1. 得到gnu Libiconv, , 和 文件, ,并同时安装。
  2. 确保gnuwin32 bin目录(通常“ c: program files gnuwin32 bin”)在您的%路径%中
  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%的努力。

其他提示

此方法适用于MSYSGIT 1.8.1,并在Windows XP上进行了测试。我使用GIT扩展2.44,但是由于更改处于GIT级别,因此它们也应该为GIT GUI工作。脚步:

  1. 安装 GNU ICONV.

  2. 创建以下脚本,命名 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
    
  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文件。

我遇到了类似的问题。

我想改善所接受的答案,因为它有一个很小的缺陷。我遇到的问题是,如果文件不存在,我会收到此错误:

conversion to cannot unsupported

我更改了命令,以便不需要文件。它仅使用stdin/stdout。这解决了问题。我的.git/配置文件现在看起来像这样:

[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

仅指定可能是问题的文件,否则清洁/污迹必须做更多的工作(临时文件)。

我们还将GIT中的UTF-16LE文件转换为UTF-8,因为这是UTF的最紧凑和便携式编码。清洁和污迹中使用的同一ICONV命令非常适合永久转换文件。

关于清洁/污迹命令的好处是,即使使用UTF-16LE签入文件,diff仍然可以正常工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top