我可以让git将文件识别为UTF-16文件吗?

我在git中跟踪一个虚拟PC虚拟机文件(* .vmc),在做一次改变之后,git将这个文件标识为二进制文件,并且不会对我进行区分。 我发现这个文件是用UTF-16编码的。

可以教git认识到这个文件是文本,并适当地处理它?

我在Cygwin下使用git,core.autocrlf设置为false。 如果需要,我可以在UNIX下使用mSysGit或git。

我一直在努力解决这个问题,刚刚发现(对我来说)一个完美的解决scheme:

$ git config --global diff.tool vimdiff # or merge.tool to get merging too! $ git difftool commit1 commit2 

git difftool采用与git diff相同的参数,但运行您select的diff程序而不是内置的GNU diff 。 所以select一个多字节感知的差异(在我的情况下, vim在差异模式),只是使用git difftool而不是git diff

find“difftool”太长打字? 没问题:

 $ git config --global alias.dt difftool $ git dt commit1 commit2 

Git的岩石。

Unices上有一个非常简单的解决scheme。

例如,苹果的.strings文件只是:

  1. 在存储库的根目录下创build一个.gitattributes文件:

     *.strings diff=localizablestrings 
  2. 将以下内容添加到~/.gitconfig文件中:

     [diff "localizablestrings"] textconv = "iconv -f utf-16 -t utf-8" 

来源: Git中的Diff .strings文件 (以及2010年之后的较旧的文章 )。

你有没有尝试设置你的.gitattributes把它当作一个文本文件?

例如:

 *.vmc set diff 

更多详情请见http://www.git-scm.com/docs/gitattributes.html

默认情况下,它看起来像git不能很好地使用UTF-16; 对于这样的文件,你必须确保没有CRLF处理,但是你需要diffmerge作为一个普通的文本文件(这是忽略你的terminal/编辑器是否可以处理UTF-16)。

但是查看.gitattributes联机帮助页 ,这里是binary的自定义属性:

 [attr]binary -diff -crlf 

所以在我看来,你可以在顶层的.gitattributesutf16定义一个自定义属性(注意,我在这里添加合并以确保它被视为文本):

 [attr]utf16 diff merge -crlf 

从那里你将能够在任何.gitattributes文件中指定类似于:

 *.vmc utf16 

另外请注意,即使git认为它是二进制文件,你仍应该能够diff文件:

 git diff --text 

编辑

这个答案基本上说,UTF-16甚至UTF-8的GNU比较不能很好地工作。 如果你想让git使用不同的工具来查看差异(通过--ext-diff ),这个答案build议Guiffy 。

但是,您可能需要的仅仅是diff仅包含ASCII字符的UTF-16文件。 一个方法得到这个工作是使用--ext-diff和下面的shell脚本:

 #!/bin/bash diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2") 

请注意,转换为UTF-8可能也适用于合并,您只需确保它在两个方向上完成。

至于在查看UTF-16文件的差异时输出到terminal:

尝试像这样的差异导致屏幕上出现二进制垃圾。 如果git使用GNU diff,那么似乎GNU diff不是unicode意识的。

GNU diff并不是真正关心unicode,所以当你使用diff –text时,它只是差异和输出文本。 问题是你正在使用的terminal无法处理发出的UTF-16(与ASCII字符的diff标记结合)。

解决方法是通过cmd.exe /c "type %1"进行筛选。 cmd的内置type将进行转换,所以你可以使用git diff的textconv能力来启用UTF-16文件的文本区分(即使未经testing也应该使用UTF-8)。

从gitattributes手册页引用:


执行二进制文件的文本差异

有时需要查看某些二进制文件的文本转换版本的差异。 例如,文字处理器文档可以被转换成ASCII文本表示,并显示文本的差异。 即使这种转换丢失了一些信息,所得到的差异对于人类观察是有用的(但不能直接应用)。

textconvconfiguration选项用于定义执行这种转换的程序。 该程序应该采取一个参数,一个文件的名称进行转换,并生成标准输出结果文本。

例如,要显示文件的exif信息的差异而不是二进制信息(假设已经安装了exif工具),请将以下部分添加到$GIT_DIR/config文件(或$HOME/.gitconfig文件)中:

 [diff "jpg"] textconv = exif 

对于mingw32的解决scheme ,cygwin的粉丝可能不得不改变方法。 问题是传递文件名转换为cmd.exe – 它将使用正斜杠,cmd采用反斜杠目录分隔符。

步骤1:

创build将执行到stdout的转换的单个参数脚本。 C:\path\为\一些\ script.sh:

 #!/bin/bash SED='s/\//\\\\\\\\/g' FILE=\`echo $1 | sed -e "$SED"\` cmd.exe /c "type $FILE" 

第2步:

设置git可以使用脚本文件。 在你的gitconfiguration里( ~/.gitconfig.git/config或者看看man git-config ),把这个:

 [diff "cmdtype"] textconv = c:/path/to/some/script.sh 

第3步:

通过使用.gitattributes文件来指出要应用此工作方式的文件(请参阅man gitattributes(5)):

 *vmc diff=cmdtype 

然后在你的文件上使用git diff

我写了一个小的git-diff驱动程序to-utf8 ,它可以很容易地区分任何非ASCII / UTF-8编码文件。 您可以使用这里的说明来安装它: https : //github.com/chaitanyagupta/gitutils#to-utf8 ( to-utf8脚本在相同的回购中可用)。

请注意,此脚本需要fileiconv命令在系统上可用。