Qual é o objetivo do `text = auto` no arquivo` .gitattributes`?

129

Principalmente .gitattributesarquivo tem * text=auto. Qual é o objetivo text=autodesse arquivo?

Fizer Khan
fonte

Respostas:

77

Dos documentos :

Cada linha no .gitattributes(ou .git/info/attributes) arquivo tem o formato:

pattern attr1 attr2 ...

Então, aqui, o padrão é *, o que significa que todos os arquivos, e o atributo é text=auto.

O que text=autofaz? A partir da documentação:

Quando o texto é definido como "automático", o caminho é marcado para normalização automática de fim de linha. Se o Git decidir que o conteúdo é texto, suas terminações de linha serão normalizadas para LF no check-in.

Qual é o comportamento padrão se não estiver ativado?

Não especificado

Se o atributo de texto não for especificado, o Git usará a variável de configuração core.autocrlf para determinar se o arquivo deve ser convertido.

O que core.autocrlffaz? Dos documentos:

   core.autocrlf

Definir essa variável como "true" é quase o mesmo que definir o atributo de texto como "auto" em todos os arquivos, exceto que não é garantido que os arquivos de texto sejam normalizados: os arquivos que contêm CRLF no repositório não serão tocados. Use esta configuração se desejar ter terminações de linha CRLF em seu diretório de trabalho, mesmo que o repositório não possua finalizações de linha normalizadas. Essa variável pode ser configurada para entrada, caso em que nenhuma conversão de saída é executada.

Se você acha isso tudo tão claro quanto a lama, não está sozinho.

Eis o que * text=autofaz nas minhas palavras: quando alguém confirma um arquivo, o Git adivinha se esse arquivo é ou não um arquivo de texto e, se for, confirmará uma versão do arquivo em que todos os bytes CR + LF são substituídos por bytes LF. Não afeta diretamente a aparência dos arquivos na árvore de trabalho. Existem outras configurações que converterão bytes LF em bytes CR + LF ao fazer o check-out de um arquivo.

Recomendação:

Eu não recomendaria colocar * text=autoo .gitattributesarquivo. Em vez disso, eu recomendaria algo como isto:

*.txt text
*.html text
*.css text
*.js text

Isso designa explicitamente quais arquivos são arquivos de texto, que convertem o CRLF em LF no banco de dados do objeto (mas não necessariamente na árvore de trabalho). Tivemos um repo com * text=auto, e o Git adivinhou errado para um arquivo de imagem que era um arquivo de texto, fazendo com que ele fosse corrompido ao substituir bytes CR + LF por bytes LF no banco de dados do objeto. Isso não foi divertido de depurar.

Se você precisar usá * text=auto-lo, coloque-o como a primeira linha .gitattributes, para que as linhas posteriores possam substituí-lo. Isso parece estar se tornando uma prática cada vez mais popular.

Flimm
fonte
2
Por que todos chamam LF como normal, mas não CRLF? existe algum ref para provar isso?
Yousha Aleayoub
1
@YoushaAleayoub O que você quer dizer?
Flimm
1
@YoushaAleayoub, se você se everyonerefere git-scm, é provavelmente porque eles estão desenvolvendo um pacote * nix e, portanto, o uso do caractere de nova linha * nix é normal .
23717 Justin Moh
4
O @YoushaAleayoub LF é considerado como "normal" porque é comum em muitas ferramentas de desenvolvimento. Ferramentas de desenvolvimento populares, como as git-scmprovenientes do * nix. MacOS usa LF. Somente o Windows (considerando apenas os sistemas operacionais de fluxo principal) está usando CRLF. Isso torna mais difícil para os desenvolvedores usarem as ferramentas * nix no Windows e para todos na troca de arquivos. Veja também Por que o CRLF .
Roi Danton
2
@Limlim, você pode explicar a diferença entre *.txt text=autoe *.txt textpor favor? Eu pensei que todas as 4 linhas no seu exemplo acima deveriam ter sido text=auto, não apenas textapós a extensão do arquivo. Os arquivos de pegada do KiCad, por exemplo (extensão ".kicad_mod"), são normalizados usando esta linha no arquivo gitattributes: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Gabriel Staples
64

Isso garante que as terminações da linha sejam normalizadas. Fonte: Kernel.org

Quando o texto é definido como "automático", o caminho é marcado para normalização automática de fim de linha. Se o git decidir que o conteúdo é texto, suas terminações de linha serão normalizadas para LF no check-in.

Se você deseja interoperar com um sistema de gerenciamento de código-fonte que imponha a normalização de fim de linha, ou simplesmente deseja que todos os arquivos de texto em seu repositório sejam normalizados, defina o atributo de texto como "automático" para todos os arquivos.

Isso garante que todos os arquivos que o git considere texto tenham finalizações de linha normalizadas (LF) no repositório.

Dave Zych
fonte
12
O que você quer dizer com final de linha normalizado?
Fizer Khan
14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych 31/01
11
Importante saber, este substitui a configuração core.autocrlf local na sua máquina ver esta grande resposta por @ Daniel Jomphe
spankmaster79
1
Seria muito bom se o git simplesmente não $% # com qualquer um dos arquivos sendo registrados no repositório. I "ve trabalhou com SLM, forçosamente, MsBuild, Fonte Depot, TFS, SVM, nenhum destes vai mudar até mesmo um byte em qualquer um dos seus arquivos Este é um git insidiosa corte IMO e me causou muita dor..
Vance McCorkle
1
O que acontece no checkout é apenas metade da história - o que acontece depois de uma compra? Seria certo dizer que, no check-out, as terminações de linha permanecem iguais LF, mesmo nas janelas?
Anthony
8

Essa configuração é referente a como as terminações de linha são tratadas. Quando ativada, todas as terminações de linha são convertidas em LF no repositório. Existem outros sinalizadores para lidar com como as terminações de linha são convertidas no seu diretório de trabalho. Informações completas sobre o assunto nos aqui: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

Karl Zöller
fonte