Posso fazer git reconhecer um arquivo UTF-16 como texto?

votos
114

Eu estou rastreando um arquivo de máquina virtual Virtual PC (* vmc) em git, e depois de fazer um git mudança identificou o arquivo como binário e não diff para mim. Eu descobri que o arquivo foi codificado em UTF-16.

git pode ser ensinado a reconhecer que este arquivo é texto e manipulá-lo adequadamente?

Eu estou usando git sob Cygwin, com o conjunto core.autocrlf como falsa. Eu poderia usar msysgit ou git em UNIX, se necessário.

Publicado 22/04/2009 em 16:51
fonte usuário
Em outras línguas...                            


8 respostas

votos
70

Eu estive lutando com esse problema por um tempo, e só descobriu (para mim) uma solução perfeita:

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

git difftoolleva os mesmos argumentos que git diffo faria, mas executa um programa diff de sua escolha em vez do built-in GNU diff. Portanto, escolha um diff multibyte-aware (no meu caso, vimno modo diff) e usar apenas git difftoolem vez de git diff.

Encontrar "difftool" muito tempo para escrever? Sem problemas:

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

rochas Git.

Respondeu 19/08/2009 em 16:55
fonte usuário

votos
43

Há uma solução muito simples que funciona fora da caixa em Unices.

Por exemplo, com da Apple .stringsapenas arquivos:

  1. Criar um .gitattributesarquivo na raiz do seu repositório com:

    *.strings diff=localizablestrings
    
  2. Adicione o seguinte ao seu ~/.gitconfigarquivo:

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

Fonte: Diff .strings arquivos em Git (e pós mais velho a partir de 2010).

Respondeu 09/01/2014 em 13:42
fonte usuário

votos
33

Você já tentou definir a sua .gitattributestratá-lo como um arquivo de texto?

por exemplo:

*.vmc diff

Mais detalhes em http://www.git-scm.com/docs/gitattributes.html .

Respondeu 22/04/2009 em 17:42
fonte usuário

votos
26

Por padrão, parece que gitnão vai funcionar bem com UTF-16; para tal arquivo que você tem que ter certeza que nenhum CRLFprocessamento é feito sobre ele, mas você quer diffe mergepara trabalhar como um arquivo de texto normal (isto é ignorar ou não o seu terminal / editor pode lidar com UTF-16).

Mas olhando para o .gitattributesmanpage , aqui é o atributo personalizado que é binary:

[attr]binary -diff -crlf

Assim, parece-me que você poderia definir um atributo personalizado em seu nível mais alto .gitattributespara utf16(note que eu adicionar fundir aqui para ter certeza de que é tratado como texto):

[attr]utf16 diff merge -crlf

De lá, você seria capaz de especificar em qualquer .gitattributesarquivo algo como:

*.vmc utf16

Observe também que você ainda deve ser capaz de diffum arquivo, mesmo se gitacha que é binário com:

git diff --text

Editar

Esta resposta basicamente diz que GNU diff wth UTF-16 ou mesmo UTF-8 não funciona muito bem. Se você quer ter gito uso de uma ferramenta diferente para ver as diferenças (via --ext-diff), essa resposta sugere Guiffy .

Mas o que você provavelmente precisa é apenas para diffum arquivo UTF-16 que contém apenas caracteres ASCII. Uma maneira de conseguir que o trabalho é a utilização --ext-diffe o seguinte script shell:

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

Note-se que a conversão para UTF-8 pode funcionar para a fusão bem, você apenas tem que ter certeza que é feito em ambas as direções.

Como para a saída para o terminal quando se olha para um diff de um arquivo UTF-16:

Tentando diff como que resulta em lixo binário expeliu para a tela. Se git está usando GNU diff, parece que GNU diff não é unicode-aware.

GNU diff realmente não se preocupam com unicode, então quando você usar diff --text que apenas diffs e emite o texto. O problema é que o terminal que você está usando não consegue lidar com o UTF-16 que é emitida (combinado com as marcas diff que são caracteres ASCII).

Respondeu 22/04/2009 em 17:40
fonte usuário

votos
7

Solução é a de filtrar através de cmd.exe /c "type %1". do cmd typebuiltin fará a conversão, e assim você pode usar isso com a capacidade Textconv de git diff para permitir diffing texto UTF-16 arquivos (deve trabalhar com UTF-8, bem como, embora não testado).

Citando página homem gitattributes:


Realizando diffs texto de arquivos binários

Às vezes é desejável para ver o diff de uma versão convertida em texto de alguns arquivos binários. Por exemplo, um documento de processador de texto pode ser convertido para uma representação de texto ASCII, e o diff do texto mostrado. Mesmo que esta conversão perde algumas informações, o diff resultante é útil para a visão humana (mas não pode ser aplicada diretamente).

A opção Textconv configuração é usado para definir um programa para realizar uma tal conversão. O programa deve ter um único argumento, o nome de um arquivo para converter, e produzir o texto resultante em stdout.

Por exemplo, para mostrar o diff das informações EXIF de um arquivo em vez da informação binária (supondo que você tem a ferramenta exif instalado), adicione a seguinte seção ao seu $GIT_DIR/configarquivo (ou $HOME/.gitconfigarquivo):

[diff "jpg"]
        textconv = exif

Uma solução para mingw32 , os fãs cygwin pode ter que alterar a abordagem. A questão é com o passar o nome do arquivo para converter em cmd.exe - será utilizando barras e cmd assume separadores de diretório barra invertida.

Passo 1:

Criar o script argumento único que fará a conversão para a saída padrão. c: \ path \ to \ some \ script.sh:

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

Passo 2:

Configure git para ser capaz de usar o arquivo de script. Dentro de sua git config ( ~/.gitconfigou .git/configou ver man git-config), coloque isso:

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

Etapa 3:

Ressalte arquivos para aplicar esta workarond para, utilizando .gitattributes arquivos (veja homem gitattributes (5)):

*vmc diff=cmdtype

em seguida, usar git diffem seus arquivos.

Respondeu 09/07/2009 em 04:48
fonte usuário

votos
4

Eu escrevi um pequeno driver git-diff, to-utf8que deve tornar mais fácil para comparar quaisquer / UTF 8-arquivos não-ASCII codificados. Você pode instalá-lo usando as instruções aqui: https://github.com/chaitanyagupta/gitutils#to-utf8 (o to-utf8script está disponível no mesmo repo).

Note que este script requer filee iconvcomanda a estar disponível no sistema.

Respondeu 02/04/2013 em 09:37
fonte usuário

votos
2

git recentemente começou a entender codificações como UTF16. Veja gitattributes docs, procurarworking-tree-encoding

[Certifique-se de partidas sua página homem uma vez que este é muito novo!]

Se (digamos) o arquivo é utf-16 sem bom na máquina Windows, em seguida, adicionar ao seu arquivo gitattributes

*.vmc text working-tree-encoding=UTF-16LE eol=CRLF

Se utf-16 (com BOM) em * nix torná-lo

*.vmc text working-tree-encoding=UTF-16 eol=LF
Respondeu 14/02/2019 em 05:02
fonte usuário

votos
0

Tive esse problema no Windows recentemente, e os dos2unixe unix2doscaixas que acompanham o git para janelas fez o truque. Por padrão, eles estão localizados no C:\Program Files\Git\usr\bin\. Observe isto só irá funcionar se o arquivo não precisa ser UTF-16. Por exemplo, alguém acidentalmente codificado um arquivo python como UTF-16 quando não precisa ser (no meu caso).

PS C:\Users\xxx> dos2unix my_file.py
dos2unix: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 Unix format...

e

PS C:\Users\xxx> unix2dos my_file.py
unix2dos: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 DOS format...
Respondeu 24/07/2018 em 15:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more