Quase quatro anos depois de fazer essa pergunta, finalmente encontrei uma resposta que me satisfaz completamente !
Veja os detalhes no github: guia de ajuda para
Lidando com terminações de linha .
O Git permite que você defina as propriedades de final de linha de um repositório diretamente usando o atributo de texto no
.gitattributes
arquivo. Esse arquivo é confirmado no repositório e substitui a core.autocrlf
configuração, permitindo garantir um comportamento consistente para todos os usuários, independentemente de suas configurações de git.
E assim
A vantagem disso é que sua configuração de final de linha agora viaja com seu repositório e você não precisa se preocupar se os colaboradores têm ou não as configurações globais apropriadas.
Aqui está um exemplo de .gitattributes
arquivo
# Auto detect text files and perform LF normalization
* text=auto
*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text
*.csproj text merge=union
*.sln text merge=union eol=crlf
*.docx diff=astextplain
*.DOCX diff=astextplain
# absolute paths are ok, as are globs
/**/postinst* text eol=lf
# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol=lf
Há uma coleção conveniente de arquivos .gitattributes prontos para usar para as linguagens de programação mais populares. É útil para você começar.
Depois de criar ou ajustar o seu .gitattributes
, você deve executar uma re-normalização de terminações de uma vez por todas .
Observe que o aplicativo GitHub Desktop pode sugerir e criar um .gitattributes
arquivo depois de abrir o repositório Git do seu projeto no aplicativo. Para tentar isso, clique no ícone de roda dentada (no canto superior direito)> Configurações do repositório ...> Finais e atributos de linha. Você será solicitado a adicionar o recomendado .gitattributes
e, se concordar, o aplicativo também executará uma normalização de todos os arquivos em seu repositório.
Por fim, o artigo Mind the End of Your Line fornece mais informações e explica como o Git evoluiu nos assuntos em questão. Considero essa leitura obrigatória .
Você provavelmente tem usuários em sua equipe que usam EGit ou JGit (ferramentas como Eclipse e TeamCity os usam) para confirmar suas alterações. Então você está sem sorte, como @gatinueta explicou nos comentários desta resposta:
Essa configuração não irá satisfazê-lo completamente se você tiver pessoas trabalhando com Egit ou JGit em sua equipe, pois essas ferramentas apenas ignoram os atributos .gitat e conferem com alegria os arquivos CRLF https://bugs.eclipse.org/bugs/show_bug.cgi? id = 342372
Um truque pode ser fazê-los confirmar suas alterações em outro cliente, diz o SourceTree . Nossa equipe naquela época preferia essa ferramenta ao EGit do Eclipse para muitos casos de uso.
Quem disse que o software é fácil? : - /
.gitattributes
?.gitattributes
que o GitHub for Windows sugere para o seu projeto? Instalei o GitHub para Windows, iniciei a versão da GUI e não consegui encontrar nenhuma opção relacionada às.gitattributes
sugestões.core.autocrlf = false
- prefiro o LF em qualquer lugar, mas algumas das ferramentas do Windows, como o Visual Studio, insistem em terminações CRLF em determinados arquivos (e até misturam-nos em alguns ...); não terminar as extremidades da linha é a opção mais segura. Se você souber o que está fazendo, eu provavelmente usariacore.autocrlf = input
e abriria exceções para projetos no Windows que você sabe que são sensíveis às terminações de linha. Como outros apontam, todo editor de texto decente suporta terminações LF agora. Na verdade, achocore.autocrlf = true
que provavelmente pode causar mais problemas do que impede.Não converta terminações de linha. Não é tarefa do VCS interpretar dados - apenas armazene e faça a versão. Todo editor de texto moderno pode ler os dois tipos de finais de linha de qualquer maneira.
fonte
Você quase sempre quer, a
autocrlf=input
menos que saiba realmente o que está fazendo.Alguns contextos adicionais abaixo:
O parágrafo acima foi originalmente retirado de um tópico no gmane.org, mas caiu desde então.
fonte
core.autocrlf=input
é a resposta canônica. Para a maioria dos casos de uso,core.autocrlf=true
ecore.autocrlf=false
são excessivamente zelosos (... de maneiras opostas, mas igualmente terríveis, é claro) e, portanto, intrinsecamente destrutivos. O "Git for Windows" deveria realmente ter sido fornecido com "Checkout como está, confirmar finalizações de linha no estilo Unix" (ou seja,core.autocrlf=input
) como sua estratégia de nova linha padrão. Isso não aconteceu. Então aqui estamos aqui - em 2015 - ainda debatendo incessantemente isso.Duas estratégias alternativas para obter consistência sobre terminações de linha em ambientes mistos (Microsoft + Linux + Mac):
A. Configuração global por todos os repositórios
1) Converta tudo em um formato
2) Defina
core.autocrlf
comoinput
no Linux / UNIX outrue
no MS Windows (repositório ou global)3) [Opcional] defina
core.safecrlf
comotrue
(para parar) ouwarn
(para cantar :) para adicionar proteção extra comparando se a transformação de nova linha reversa resultaria no mesmo arquivoB. Ou por configuração do repositório
1) Converta tudo em um formato
2) adicione o
.gitattributes
arquivo ao seu repositórioNão se preocupe com seus arquivos binários - o Git deve ser inteligente o suficiente sobre eles.
Mais sobre variáveis safecrlf / autocrlf
fonte
dos2unix
é uma ferramenta de linha de comando que, dependendo do sistema, você pode precisar instalar adicionalmentedos2unix
- existe o risco de corromper.git/index
e não precisamos aplicá-lo a todos os arquivos. É melhor usar algo comofind ./ -name "*.html"
e especificar em quais arquivos você deseja aplicá-lo.find
linhas, lembre-se: odos2unix
que acompanha o Git for Windows possui um comportamento peculiar (idiota e perigoso da IMO), sem argumentos: em vez de mudar para UNIX, alterna o formato de nova linha (DOS <-> UNIX )Tente definir a
core.autocrlf
opção de configuração paratrue
. Também dê uma olhada nacore.safecrlf
opção.Na verdade, parece que
core.safecrlf
já pode estar definido no seu repositório, porque (ênfase minha):Se for esse o caso, convém verificar se o seu editor de texto está configurado para usar as terminações de linha de forma consistente. Você provavelmente terá problemas se um arquivo de texto contiver uma mistura de terminações de linha LF e CRLF.
Por fim, sinto que a recomendação de simplesmente "usar o que você recebeu" e usar linhas terminadas por LF no Windows causará mais problemas do que resolve. O Git tem as opções acima para tentar manipular as terminações de linha de maneira sensata, por isso faz sentido usá-las.
fonte
O uso
core.autocrlf=false
interrompeu a atualização de todos os arquivos assim que os fiz no meu projeto do Visual Studio 2010 . Os outros dois membros da equipe de desenvolvimento também estão usando sistemas Windows para que um ambiente misto não entre em jogo, mas as configurações padrão que acompanham o repositório sempre marcam todos os arquivos como atualizados imediatamente após a clonagem.Eu acho que a linha inferior é descobrir qual configuração CRLF funciona para o seu ambiente. Especialmente porque em muitos outros repositórios em nossas caixas de Linux, a configuração
autocrlf = true
produz melhores resultados.Mais de 20 anos depois e ainda estamos lidando com disparidades de final de linha entre sistemas operacionais ... triste.
fonte
Essas são as duas opções para usuários do Windows e do Visual Studio que compartilham código com usuários do Mac ou Linux . Para uma explicação detalhada, leia o manual gitattributes .
* texto = automático
No
.gitattributes
arquivo do seu repo, adicione:Isso normalizará todos os arquivos com
LF
finais de linha no repositório.E, dependendo do seu sistema operacional (
core.eol
configuração), os arquivos na árvore de trabalho serão normalizadosLF
para sistemas baseados em Unix ouCRLF
sistemas Windows.Essa é a configuração que os repositórios Microsoft .NET usam.
Exemplo:
Será normalizado no repositório sempre como:
Na finalização da compra, a árvore de trabalho no Windows será convertida em:
No checkout, a árvore de trabalho no Mac será deixada como:
core.autocrlf = true
Se
text
não for especificado no.gitattributes
arquivo, o Git usará acore.autocrlf
variável de configuração para determinar se o arquivo deve ser convertido.Para usuários do Windows,
git config --global core.autocrlf true
é uma ótima opção porque:LF
finais de linha somente quando adicionados ao repositório. Se houver arquivos não normalizados no repositório, essa configuração não os tocará.CRLF
finais de linha no diretório ativo.O problema com essa abordagem é que:
autocrlf = input
, verá vários arquivos comLF
finais de linha. Não é um risco para o resto da equipe, porque seus commit ainda serão normalizados comLF
finais de linha.core.autocrlf = false
, verá vários arquivos comLF
finais de linha e poderá introduzir arquivos comCRLF
final de linha no repositório.autocrlf = input
e pode obter arquivos comCRLF
finais de arquivos, provavelmente de usuários do Windows comcore.autocrlf = false
.fonte
git config --global core.autocrl true
. Você quer dizergit config --global core.autocrlf true
.--- ATUALIZAÇÃO 3 --- (não entra em conflito com a ATUALIZAÇÃO 2)
Considerando o caso em que os usuários do Windows preferem trabalhar
CRLF
e os usuários Linux / Mac preferem trabalhar emLF
arquivos de texto. Fornecendo a resposta da perspectiva de um mantenedor de repositório :Para mim, a melhor estratégia (menos problemas a resolver) é: mantenha todos os arquivos de texto com o
LF
git repo, mesmo se você estiver trabalhando em um projeto somente para Windows. Em seguida, permita que os clientes trabalhem no estilo de final de linha de sua preferência , desde que eles escolham umcore.autocrlf
valor de propriedade que respeite sua estratégia (LF no repo) enquanto prepara arquivos para confirmação.A preparação é o que muitas pessoas confundem ao tentar entender como as estratégias de nova linha funcionam. É essencial entender os seguintes pontos antes de escolher o valor correto para a
core.autocrlf
propriedade:.git/
do subdiretório com finais de linha convertidos (dependendo docore.autocrlf
valor da configuração do cliente). Tudo isso é feito localmente.core.autocrlf
é como fornecer uma resposta para a pergunta (exatamente a mesma pergunta em todos os sistemas operacionais):false:
" não execute nenhuma das opções acima ",input:
" faça apenas b "true
: " faça aeb "Felizmente
core.autocrlf: true
:, linux / mac:)core.autocrlf: false
serão compatíveis com a estratégia LF-only-repo .Significado : os clientes do Windows, por padrão, serão convertidos em CRLF ao fazer check-out do repositório e convertidos em LF ao adicionar para confirmação. E os clientes linux, por padrão, não fazem conversões. Teoricamente, isso mantém o seu repositório apenas.
Infelizmente:
core.autocrlf
valor gitcore.autocrlf=false
e adicionam um arquivo com CRLF para confirmação.Para detectar arquivos de texto ASAP não lf confirmados pelos clientes acima, você pode seguir o que está descrito em --- atualização 2 ---: (
git grep -I --files-with-matches --perl-regexp '\r' HEAD
, em um cliente compilado usando:--with-libpcre
flag)E aqui está o problema: . Como mantenedor de repositório, mantenho um
git.autocrlf=input
arquivo para que eu possa corrigir todos os arquivos confirmados incorretamente apenas adicionando-os novamente para confirmação. E forneço um texto de confirmação: "Corrigindo arquivos confirmados incorretamente".Tanto quanto
.gitattributes
é aprendido. Não conto com isso, porque há mais clientes de interface do usuário que não entendem. Só o uso para fornecer dicas para arquivos binários e de texto e talvez sinalizar alguns arquivos excepcionais que devem manter em todos os lugares as mesmas terminações de linha:Pergunta: Mas por que estamos interessados na estratégia de manipulação de novas linhas?
Resposta: Para evitar uma confirmação de alteração de letra única, apareça como uma alteração de 5000 linhas , apenas porque o cliente que executou a alteração converteu automaticamente o arquivo completo de crlf para lf (ou o oposto) antes de adicioná-lo para confirmação. Isso pode ser bastante doloroso quando há uma resolução de conflito envolvida. Ou, em alguns casos, pode ser a causa de conflitos irracionais.
--- ATUALIZAÇÃO 2 ---
Os padrões do cliente git funcionarão na maioria dos casos. Mesmo se você tiver apenas clientes com Windows, Linux apenas com clientes ou ambos. Esses são:
core.autocrlf=true
significa converter linhas em CRLF no checkout e converter linhas em LF ao adicionar arquivos.core.autocrlf=input
significa não converter linhas no checkout (não é necessário, pois é esperado que os arquivos sejam comprometidos com o LF) e converter linhas em LF (se necessário) ao adicionar arquivos. ( - update3 - : parece que estáfalse
por padrão, mas novamente está bom)A propriedade pode ser configurada em diferentes escopos. Eu sugeriria definir explicitamente o
--global
escopo, para evitar alguns problemas de IDE descritos no final.Também desencorajaria fortemente o uso no Windows
git config --global core.autocrlf false
(no caso de você possuir apenas clientes Windows), em contraste com o que é proposto para a documentação do git . Definir como false confirmará os arquivos com CRLF no repositório. Mas realmente não há razão. Você nunca sabe se precisará compartilhar o projeto com os usuários do Linux. Além disso, é uma etapa extra para cada cliente que ingressa no projeto em vez de usar os padrões.Agora, para alguns casos especiais de arquivos (por exemplo
*.bat
*.sh
), nos quais você deseja que eles sejam verificados com LF ou com CRLF, você pode usar.gitattributes
Para resumir, a melhor prática é:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Nota: no windows clients funciona apenas atravésgit-bash
e no linux clients somente se compilado usando--with-libpcre
in./configure
).core.autocrlf=input
( --- atualização 3 - ).gitattributes
core.autocrlf
descrito acima para seus valores padrão..gitattributes
. os clientes-git dos IDEs podem ignorá-los ou tratá-los de maneira diferente.Como dito, algumas coisas podem ser adicionadas nos atributos git:
Eu acho que algumas outras opções seguras para, em
.gitattributes
vez de usar a detecção automática de arquivos binários:-text
(por exemplo, para*.zip
ou*.jpg
arquivos: não serão tratados como texto. Portanto, nenhuma conversão de final de linha será tentada. A diferença pode ser possível através de programas de conversão)text !eol
(por exemplo*.java
, for*.html
:: tratado como texto, mas a preferência de estilo eol não está definida. Portanto, a configuração do cliente é usada.)-text -diff -merge
(por exemplo, para*.hugefile
: Não tratado como texto. Não é possível obter diferenças / mesclagens)--- ATUALIZAÇÃO ANTERIOR ---
Um exemplo doloroso de um cliente que confirmará arquivos incorretamente:
O netbeans 8.2 (no Windows) comprometerá erroneamente todos os arquivos de texto com CRLFs, a menos que você tenha definido explicitamente
core.autocrlf
como global . Isso contradiz o comportamento padrão do cliente git e causa muitos problemas posteriormente, durante a atualização / mesclagem. É isso que faz com que alguns arquivos pareçam diferentes (embora não sejam), mesmo quando você reverte .O mesmo comportamento no netbeans acontece mesmo se você adicionou o correto
.gitattributes
ao seu projeto.Usar o comando a seguir após uma confirmação, pelo menos, ajudará a detectar com antecedência se o seu repositório git tem problemas de final de linha:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
Passei horas para encontrar o melhor uso possível.gitattributes
, para finalmente perceber, que não posso contar com isso.Infelizmente, enquanto existirem editores baseados em JGit (que não podem ser manipulados
.gitattributes
corretamente), a solução segura é forçar o LF em qualquer lugar, mesmo no nível do editor.Use os seguintes
anti-CRLF
desinfetantes.clientes windows / linux:
core.autocrlf=input
comprometido
.gitattributes
:* text=auto eol=lf
commit
.editorconfig
( http://editorconfig.org/ ), que é um tipo de formato padronizado, combinado com plugins de editor:https://github.com/welovecoding/editorconfig-netbeans/fonte
.gitattributes
linha, pois ela possui conseques não intencionais no Git <2.10, consulte stackoverflow.com/a/29508751/2261442git config --global core.autocrlf false
e recomendando lidar com o eol.gitattributes
apenas nas diretrizes.Esta é apenas uma solução alternativa :
Em casos normais, use as soluções fornecidas com o git. Estes funcionam muito bem na maioria dos casos. Força para LF se você compartilhar o desenvolvimento em sistemas baseados em Windows e Unix, definindo .gitattributes .
No meu caso, havia> 10 programadores desenvolvendo um projeto no Windows. Este projeto foi verificado com o CRLF e não havia opção para forçar o LF.
Algumas configurações foram gravadas internamente na minha máquina sem nenhuma influência no formato LF; portanto, alguns arquivos foram globalmente alterados para LF em cada alteração de arquivo pequeno.
Minha solução:
Máquinas Windows: Deixe tudo como está. Não se preocupe com nada, já que você é um desenvolvedor padrão de 'lobo solitário' e precisa lidar com o seguinte: "Não existe outro sistema no mundo inteiro, é?"
Máquinas Unix
Adicione as seguintes linhas à
[alias]
seção de uma configuração . Este comando lista todos os arquivos alterados (isto é, modificados / novos):Converta todos os arquivos alterados no formato dos:
Opcionalmente ...
Crie um gancho git para esta ação para automatizar esse processo
Use parâmetros e inclua-o e modifique a
grep
função para corresponder apenas a nomes de arquivos específicos, por exemplo:Sinta-se à vontade para torná-lo ainda mais conveniente usando um atalho adicional:
... e dispare o material convertido digitando
fonte