Em um projeto em que alguns dos arquivos contêm ^ M como separadores de nova linha. A difusão desses arquivos é aparentemente impossível, pois o git-diff vê como o arquivo inteiro é apenas uma única linha.
Como alguém se diferencia da versão anterior?
Existe uma opção como "tratar ^ M como nova linha ao diferir"?
prompt> git-diff "HEAD^" -- MyFile.as
diff --git a/myproject/MyFile.as b/myproject/MyFile.as
index be78321..a393ba3 100644
--- a/myproject/MyFile.cpp
+++ b/myproject/MyFile.cpp
@@ -1 +1 @@
-<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
+<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
prompt>
ATUALIZAR:
agora escrevi um script Ruby que verifica as últimas 10 revisões e converte CR em LF.
require 'fileutils'
if ARGV.size != 3
puts "a git-path must be provided"
puts "a filename must be provided"
puts "a result-dir must be provided"
puts "example:"
puts "ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile"
exit(1)
end
gitpath = ARGV[0]
filename = ARGV[1]
resultdir = ARGV[2]
unless FileTest.exist?(".git")
puts "this command must be run in the same dir as where .git resides"
exit(1)
end
if FileTest.exist?(resultdir)
puts "the result dir must not exist"
exit(1)
end
FileUtils.mkdir(resultdir)
10.times do |i|
revision = "^" * i
cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}"
puts cmd
system cmd
end
git diff -b
- Mostrei isso em stackoverflow.com/a/46265081/58794git diff --ignore-cr-at-eol
. Veja minha resposta abaixo .git diff -b
é idênticogit diff --ignore-space-change
.Respostas:
O GitHub sugere que você deve usar \ n apenas como um caractere de nova linha em repositórios manipulados por git. Há uma opção para converter automaticamente:
Obviamente, isso é dito para converter crlf em lf, enquanto você deseja converter crlf em lf. Espero que isso ainda funcione ...
E depois converta seus arquivos:
core.autocrlf é descrito na página do manual .
fonte
git config core.whitespace cr-at-eol
.warning: LF will be replaced by CRLF
em vez dewarning: CRLF will be replaced by LF
, e eu estou em Linux. Alguma idéia do porquê? Quero que tudo termine com LF, não com CRLF!git config --global core.autocrlf input
, execute as etapas nesta resposta (rm, adicione, confirme) e você obteráwarning: CRLF will be replaced by LF. The file will have its original line endings in your working directory.
. Remova os arquivos (porque eles têm o CRLF original errado) e faça o check-out novamente do último commit "Fix CRLF".Desenvolvendo no Windows, encontrei esse problema ao usar
git tfs
. Eu resolvi assim:Isso basicamente diz ao Git que um CR de fim de linha não é um erro. Como um resultado, essas irritantes
^M
caracteres já não aparecem no fim das linhas nogit diff
,git show
etc.Parece deixar outras configurações como estão; por exemplo, espaços extras no final de uma linha ainda aparecem como erros (destacados em vermelho) no diff.
(Outras respostas aludiram a isso, mas o acima é exatamente como definir a configuração. Para definir a configuração para apenas um projeto, omita o
--global
.)EDIT :
Depois de muitas tarefas de final de linha, tive a melhor sorte, ao trabalhar em uma equipe .NET, com estas configurações:
Se você precisar usar a configuração de espaço em branco, provavelmente deverá ativá-la somente por projeto, se precisar interagir com o TFS. Apenas omita o
--global
:Se você precisar remover algumas configurações principais. *, A maneira mais fácil é executar este comando:
Isso abre seu arquivo .gitconfig global em um editor de texto e você pode excluir facilmente as linhas que deseja remover. (Ou você pode colocar '#' na frente deles para comentar.)
fonte
core.autocrlf
paratrue
git config --global core.whitespace cr-at-eol
desativaria outras configurações padrão. Existem três padrões: espaço em branco na etiqueta, espaço em branco e espaço antes da guia. Portanto, para ativar o cr-at-eol, mantendo os outros que você precisaria usargit config --global core.whitespace blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
.cr-at-eol
livrando^M
no final das linhasgit diff
, mas o GIT ainda mostrava essas linhas como diferentes, embora o final da linha fosse a única diferença.Tente
git diff --ignore-space-at-eol
, ougit diff --ignore-space-change
, ougit diff --ignore-all-space
.fonte
autocrlf
configurações. Obrigado!Veja também:
ou equivalente,
onde
whitespace
é precedido por um caractere de tabulação .fonte
git show
) parar de me incomodar com os^M
s nas linhas alteradas! :) #git diff
ainda mostra ^ M caracteres.git config --global core.whitespace cr-at-eol
(onde --global é opcional, se você só quer que o repo você está no)[core]
para substituir ocore.
prefixo por um caractere TAB.^M
-segit diff
, não de como não colocar ^ M em primeiro lugar. Isso significa que a resposta aceita para a alteraçãocore.autocrlf
não é a melhor porque altera silenciosamente os arquivos sem a confirmação do usuário.Por que você os coloca
^M
no seugit diff
?No meu caso, eu estava trabalhando em um projeto desenvolvido no Windows e usei o OS X. Quando alterei algum código, vi
^M
no final das linhas adicionadasgit diff
. Eu acho^M
que eles estavam aparecendo porque eram finais de linha diferentes dos demais arquivos. Como o restante do arquivo foi desenvolvido no Windows, ele utilizavaCR
finais de linha e, no OS X,LF
final de linha.Aparentemente, o desenvolvedor do Windows não usou a opção "Fazer checkout no estilo Windows, confirmar finais de linha no estilo Unix " durante a instalação do Git.
Então, o que devemos fazer sobre isso?
Você pode fazer com que os usuários do Windows reinstale o git e use a opção " Checkout no estilo Windows, confirme finais de linha no estilo Unix ". É isso que eu preferiria, porque vejo o Windows como uma exceção em seus caracteres de final de linha e o Windows corrige seu próprio problema dessa maneira.
Se você optar por esta opção, deverá corrigir os arquivos atuais (porque eles ainda estão usando as
CR
terminações de linha). Eu fiz isso seguindo estas etapas:Remova todos os arquivos do repositório, mas não do seu sistema de arquivos.
Adicione um
.gitattributes
arquivo que imponha certos arquivos para usar umLF
final de linha. Coloque isso no arquivo:Substitua
.ext
pelas extensões de arquivo que você deseja corresponder.Adicione todos os arquivos novamente.
Isso mostrará mensagens como esta:
Você pode remover o
.gitattributes
arquivo, a menos que tenha usuários teimosos do Windows que não desejam usar a opção " Checkout no estilo Windows, confirmar finalizações de linha no estilo Unix ".Comprometa e empurre tudo.
Remova e faça o check-out dos arquivos aplicáveis em todos os sistemas em que são usados. Nos sistemas Windows, certifique-se de que agora eles usem a opção " Checkout no estilo Windows, confirme finais de linha no estilo Unix ". Você também deve fazer isso no sistema em que executou essas tarefas, porque quando você adicionou os arquivos, o git disse:
Você pode fazer algo assim para remover os arquivos:
E então, para recuperá-los com as terminações de linha corretas:
É claro que substituindo
.ext
pela extensão que você deseja.Agora, seu projeto usa apenas
LF
caracteres para as terminações de linha, e osCR
caracteres desagradáveis nunca mais voltarão :).A outra opção é aplicar as terminações de linha de estilo do Windows. Você também pode usar o
.gitattributes
arquivo para isso.Mais informações: https://help.github.com/articles/dealing-with-line-endings/#platform-all
fonte
View
->Line Endings
e clicar emUnix
.^M
significa? É uma nova linha do Windows ou Linux? Ou é apenas uma nova linha "diferente" em comparação com as outras novas linhas no arquivo?git config --global core.autocrlf true
é um exagero, e a anti-Windows / anti-CR
campaign parece tangencial à pergunta.Haverá um com o Git 2.16 (primeiro trimestre de 2018), como o "
diff
família de comandos " aprendeu a ignorar as diferenças no retorno de carro no final da linha.Veja commit e9282f0 (26 de outubro de 2017) por Junio C Hamano (
gitster
) .Ajudado por: Johannes Schindelin (
dscho
) .(Mesclado por Junio C Hamano -
gitster
- na confirmação 10f65c2 , 27 de novembro de 2017)fonte
git config --global core.autocrlf true
como na resposta aceita, isso responde mais diretamente à pergunta do OP: 'Existe uma opção como "tratar ^ M como nova linha ao diferir"?git version 2.20.1 (Apple Git-117)
mas adicionar a resposta core.pager de Jason Pyeron, o corrigiu. YMMV obviamente.TL; DR
Mude
core.pager
para para"tr -d '\r' | less -REX"
, não para o código fonteIsso é por que
Os incômodos ^ M mostrados são um artefato da colorização e do pager. É causada por
less -R
uma opção padrão do git pager. (o pager padrão do git éless -REX
)A primeira coisa a observar é que
git diff -b
não mostrará alterações no espaço em branco (por exemplo, \ r \ n vs \ n)configuração:
Um teste rápido para criar um arquivo unix e alterar as terminações de linha não mostrará alterações com
git diff -b
:Observamos que forçar um tubo para menos não mostra o ^ M, mas ativando a cor e
less -R
:A correção é mostrada usando um tubo para remover o \ r (^ M) da saída:
Uma alternativa imprudente é usar
less -r
, porque passará por todos os códigos de controle, não apenas pelos códigos de cores.Se você quiser apenas editar seu arquivo de configuração git diretamente, esta é a entrada para atualizar / adicionar:
fonte
\r\n
finais de linha e outros tinham\n
final de linha (não sei se isso é relevante); diffs do primeiro mostrou o^M
nas linhas modificadas (ou seja, as+
linhas).core.autocrlf
foi definido comotrue
. Corrergit config core.pager "tr -d '\r' | less -REX"
se livrou dos traquinas^M
. Obrigado!git diff -b
é o que eu estava procurando, mas aprecio a explicação completa.[core]
seção do arquivo "config" do git adicionandopager = tr -d '\\r' | less -REX
foi a única resposta que funcionou para mim. Obrigado!Eu lutei com esse problema por um longo tempo. De longe, a solução mais fácil é não se preocupar com os caracteres ^ M e apenas usar uma ferramenta visual diff que possa lidar com eles.
Em vez de digitar:
tentar:
fonte
No meu caso, o que foi esse comando:
Fonte: https://public-inbox.org/git/[email protected]/T/
fonte
Conforme observado pelo VonC, isso já foi incluído no git 2.16+. Infelizmente, o nome da opção (
--ignore-cr-at-eol
) difere daquele usado pelo GNU diff com o qual estou acostumado (--strip-trailing-cr
).Quando fui confrontado com esse problema, minha solução foi chamar o GNU diff em vez do diff interno do git, porque meu git é mais antigo que 2.16. Eu fiz isso usando esta linha de comando:
Isso permite o uso
--strip-trailing-cr
e qualquer outra opção de diferença GNU.Há também esta outra maneira:
mas não usa as configurações do pager, e é por isso que prefiro o primeiro.
fonte