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

问题描述 投票:0回答:3

有没有办法让

git gui
以某种方式显示和显示 UTF-16 文件的差异?

我找到了一些信息,但这主要是指命令行而不是 GUI。

git diff utf-16 git-gui
3个回答
5
投票

在 msysGit 人员的帮助下,我一直致力于 much 更好的解决方案,并提出了这个清洁/污迹过滤器。过滤器使用 Gnu file 和 iconv 命令来确定文件的类型,并将其与 msysGit 的内部 UTF-8 格式相互转换。

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

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

要设置此过滤器:

  1. 获取 Gnu libiconvfile,并安装两者。
  2. 确保 GnuWin32 目录(通常是“C:\Program Files\GnuWin32 in”)在你的 %PATH%
  3. 将以下内容添加到 ~\Git tc\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 文件的目录中使用了它。到目前为止它正在工作。不出意外的话,这看起来 20% 的努力可以解决 80% 的 Windows 文本格式问题。


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
投票

我遇到了类似的问题。

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

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

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

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

clean/smudge 命令的好处在于,即使文件是使用 UTF-16LE 签入的,diff 仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.