git gui - 可以显示UTF16吗?

时间:2010-10-12 13:15:51

标签: git diff utf-16 git-gui

有没有办法让git gui显示并以某种方式显示UTF16文件的差异?

我找到了some information,但这主要是指命令行而不是gui。

3 个答案:

答案 0 :(得分:5)

在msysGit的帮助下,我一直在研究很多更好的解决方案,并提出了这个干净/涂抹过滤器。过滤器使用Gnu文件和iconv命令来确定文件的类型,并将其转换为msysGit的内部UTF-8格式。

这种类型的清洁/涂抹过滤器为您提供了更大的灵活性。它应该允许Git在大多数情况下将混合格式文件视为UTF-8文本:diffs,merge,git-grep,以及golattributes属性,如eol-conversion,ident-replacement和内置diff模式。

上面概述的差异滤镜解决方案仅适用于差异,因此受到更多限制。

设置此过滤器:

  1. 获取Gnu libiconvfile,然后同时安装。
  2. 确保GnuWin32 \ bin目录(通常为“C:\ Program Files \ 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或local~ / .gitattributes中添加一行来处理混合格式文本,例如:

    *.txt filter=mixedtext
    
  5. 我在使用ANSI,UTF-16和UTF-8格式的sql文件的目录上使用了它。它到目前为止工作。除非出现任何意外,否则这可能会覆盖80%的Windows文本格式问题。

答案 1 :(得分:3)

此方法适用于MSysGit 1.8.1,并在Windows XP上进行测试。我使用Git Extensions 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文件。

答案 2 :(得分: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必须执行更多工作(临时文件)。

我们还将git中的UTF-16le文件批量转换为UTF-8,因为这是UTF最紧凑和可移植的编码。清理和涂抹中使用的相同iconv命令非常适合永久转换文件。

关于clean / smudge命令的好处是,即使用UTF-16le签入文件,差异仍然有用。