Principalmente .gitattributes
arquivo tem * text=auto
. Qual é o objetivo text=auto
desse arquivo?
Principalmente .gitattributes
arquivo tem * text=auto
. Qual é o objetivo text=auto
desse arquivo?
Respostas:
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=auto
faz? 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.autocrlf
faz? 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=auto
faz 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.
Eu não recomendaria colocar * text=auto
o .gitattributes
arquivo. 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.
everyone
refere git-scm
, é provavelmente porque eles estão desenvolvendo um pacote * nix e, portanto, o uso do caractere de nova linha * nix é normal .
git-scm
provenientes 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 .
*.txt text=auto
e *.txt text
por favor? Eu pensei que todas as 4 linhas no seu exemplo acima deveriam ter sido text=auto
, não apenas text
apó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 ).
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.
When a text file is normalized, its line endings are converted to LF in the repository.
LF
, mesmo nas janelas?
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