我可以让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
文件只是:
-
在存储库的根目录下创build一个
.gitattributes
文件:*.strings diff=localizablestrings
-
将以下内容添加到
~/.gitconfig
文件中:[diff "localizablestrings"] textconv = "iconv -f utf-16 -t utf-8"
来源: Git中的Diff .strings文件 (以及2010年之后的较旧的文章 )。
你有没有尝试设置你的.gitattributes
把它当作一个文本文件?
例如:
*.vmc set diff
默认情况下,它看起来像git
不能很好地使用UTF-16; 对于这样的文件,你必须确保没有CRLF
处理,但是你需要diff
和merge
作为一个普通的文本文件(这是忽略你的terminal/编辑器是否可以处理UTF-16)。
但是查看.gitattributes
联机帮助页 ,这里是binary
的自定义属性:
[attr]binary -diff -crlf
所以在我看来,你可以在顶层的.gitattributes
为utf16
定义一个自定义属性(注意,我在这里添加合并以确保它被视为文本):
[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
脚本在相同的回购中可用)。
请注意,此脚本需要file
和iconv
命令在系统上可用。