Como faço o Git tratar um arquivo como binário?

104

Tendo um problema com um projeto de tamanho médio onde os arquivos de projeto do Visual Studio continuam tendo problemas devido ao git tratá-los como texto e mesclagem. Eu gostaria de apenas definir o arquivo como binário para que o git nunca mescle esses arquivos automaticamente.

Existe uma maneira de fazer isso?

Charles Randall
fonte
2
Mas os arquivos de projeto do Visual Studio são arquivos de texto e precisam ser mesclados?
CB Bailey
1
@CharlesBailey Eles irão se fundir periodicamente da pior maneira possível, bagunçando todas as suas construções. Não quero mexer com o XML, quero que ele me peça para adicionar manualmente novos arquivos ou possivelmente até mesmo executar uma ferramenta de comparação de XML que saiba como lidar com isso corretamente.
michael.bartnett
1
@ michael.bartnett: Só se você bagunçar a fusão, certo?
CB Bailey
1
@CharlesBailey Claro, se eu estiver mesclando manualmente, não há problema. Mas isso não é algo que eu deveria ter que mesclar manualmente. Geralmente é um item de construção adicionar / remover / editar ... que é totalmente auto-mesclável, mas não pelo método usual de diff por linha. Confira esta apresentação para mais informações sobre o assunto .
michael.bartnett
@ michael.bartnett: Configure um driver de mesclagem melhor, então. O que eu queria dizer (há 10 meses) era que os arquivos do projeto podem e devem ser mesclados. Pessoalmente, prefiro muito mais consertar uma tentativa razoável de máquina do que fazê-lo totalmente à mão, o que parece um trabalho desnecessário.
CB Bailey

Respostas:

135

Sim, usando atributos . Coloque algo assim em seu .gitattributesarquivo (crie-o se não existir):

*.sln binary
*.suo binary
*.vcxproj binary

Na binaryverdade, aqui está uma macro predefinida , equivalente a -diff -merge -text.

Se você ainda quiser ver a diferença, pode usar:

*.sln -merge -text

Desta forma, os *.slnarquivos não serão mesclados, não terão o eol normalizado, mas poderão ser difundidos.

Michael Wild
fonte
1
onde está esse arquivo?
neves
@neves Everywhere um arquivo gitignore pode ser localizado, conforme a documentação fornecida pelo link na resposta dada.
Michael Wild
4
@neves: você precisa fazer um, localmente em seu repo ou globalmente, por exemplo, ~/.gitattributese depois executar, git config --global core.attributesfile ~/.gitattributesconsulte stackoverflow.com/questions/28026767/…
jan-glx,
O que acontece com esses arquivos se eles não forem mesclados automaticamente? Uma versão foi escolhida ou você precisa mesclar manualmente?
ClydeTheGhost
1
@ClydeTheGhost você terá que escolher um.
Michael Wild
6

Você deve definir os atributos do arquivo binário em seu .gitattributesarquivo (crie-o se não existir) colocando estas linhas nele, para evitar que ele seja tratado como um arquivo de texto diff:

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.sln     -text diff
*.suo     -text diff
*.vcxproj -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff   
Omar Alahmed
fonte