Dans un projet où certains fichiers contiennent ^ M comme séparateurs de nouvelle ligne. Différer ces fichiers est apparemment impossible, car git-diff le voit car le fichier entier n'est qu'une seule ligne.
En quoi diffère-t-on de la version précédente?
Existe-t-il une option comme "traiter ^ M comme un saut de ligne en cas de différence"?
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>
MISE À JOUR:
maintenant j'ai écrit un script Ruby qui vérifie les 10 dernières révisions et convertit CR en 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
- je l'ai montré dans stackoverflow.com/a/46265081/58794git diff --ignore-cr-at-eol
. Voir ma réponse ci-dessous .git diff -b
est identique àgit diff --ignore-space-change
.Réponses:
GitHub suggère que vous devez vous assurer d'utiliser uniquement \ n comme caractère de nouvelle ligne dans les dépôts git. Il existe une option de conversion automatique:
Bien sûr, cela est censé convertir crlf en lf, tandis que vous voulez convertir cr en lf. J'espère que cela fonctionne toujours…
Et puis convertissez vos fichiers:
core.autocrlf est décrit sur la page de manuel .
la source
git config core.whitespace cr-at-eol
.warning: LF will be replaced by CRLF
lieu dewarning: CRLF will be replaced by LF
, et je suis sous Linux. Une idée pourquoi? Je veux que tout se termine avec LF, pas CRLF!git config --global core.autocrlf input
, suivez les étapes de cette réponse (rm, add, commit), et vous obtiendrezwarning: CRLF will be replaced by LF. The file will have its original line endings in your working directory.
. Supprimez les fichiers (car ils contiennent le CRLF incorrect d'origine) et extrayez-les à nouveau du dernier commit "Fix CRLF".En développant sur Windows, j'ai rencontré ce problème lors de l'utilisation
git tfs
. Je l'ai résolu de cette façon:Cela indique essentiellement à Git qu'un CR de fin de ligne n'est pas une erreur. En conséquence, ces ennuyeux
^M
personnages ne semblent plus à la fin des lignesgit diff
,git show
etc.Il semble laisser les autres paramètres tels quels; par exemple, les espaces supplémentaires à la fin d'une ligne apparaissent toujours comme des erreurs (surlignées en rouge) dans le diff.
(D'autres réponses ont fait allusion à cela, mais ce qui précède est exactement comment définir le paramètre. Pour définir le paramètre pour un seul projet, omettez le
--global
.)MODIFIER :
Après de nombreux essais de fin de ligne, j'ai eu la meilleure chance, lorsque je travaillais sur une équipe .NET, avec ces paramètres:
Si vous devez utiliser le paramètre d'espaces, vous ne devriez probablement l'activer que par projet si vous avez besoin d'interagir avec TFS. Oubliez simplement
--global
:Si vous devez supprimer certains paramètres de base. *, Le moyen le plus simple consiste à exécuter cette commande:
Cela ouvre votre fichier global .gitconfig dans un éditeur de texte et vous pouvez facilement supprimer les lignes que vous souhaitez supprimer. (Ou vous pouvez mettre «#» devant eux pour les commenter.)
la source
core.autocrlf
àtrue
git config --global core.whitespace cr-at-eol
désactiverait les autres paramètres par défaut. Il y a trois valeurs par défaut: blank-at-eol, blank-at-eof et space-before-tab. Donc, pour activer cr-at-eol tout en gardant les autres que vous devez utilisergit config --global core.whitespace blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
.cr-at-eol
suis débarrassé de^M
la fin des lignesgit diff
, mais GIT a toujours montré ces lignes comme différentes, bien que la fin de la ligne soit la seule différence.Essayez
git diff --ignore-space-at-eol
, ougit diff --ignore-space-change
, ougit diff --ignore-all-space
.la source
autocrlf
paramètres. Merci!Regarde aussi:
ou équivalent,
où
whitespace
est précédé d'un caractère de tabulation .la source
git show
) a cessé de m'embêter sur les^M
s sur les lignes modifiées! :)git diff
affiche toujours ^ M caractères.git config --global core.whitespace cr-at-eol
(où --global est facultatif si vous le voulez juste sur le dépôt sur lequel vous êtes)[core]
pour que je puisse remplacer lecore.
préfixe par un caractère TAB.^M
dansgit diff
, et non pas sur la façon de ne pas mettre en ^ M en premier lieu. Cela signifie que la réponse acceptée de modificationcore.autocrlf
n'est pas la meilleure car elle modifie silencieusement les fichiers sans confirmation de l'utilisateur.Pourquoi les mettez-vous
^M
dans votregit diff
?Dans mon cas, je travaillais sur un projet développé sous Windows et j'ai utilisé OS X. Quand j'ai changé du code, j'ai vu
^M
à la fin des lignes que j'avais ajoutéesgit diff
. Je pense que les^M
apparaissaient parce que leurs fins de ligne étaient différentes de celles du reste du fichier. Étant donné que le reste du fichier a été développé sous Windows, il a utilisé desCR
fins de ligne et sous OS X, il utilise desLF
fins de ligne.Apparemment, le développeur Windows n'a pas utilisé l'option " Extraire le style Windows, valider les fins de ligne de style Unix " lors de l'installation de Git.
Alors, que devons-nous faire à ce sujet?
Vous pouvez demander aux utilisateurs de Windows de réinstaller git et d'utiliser l' option " Extraire le style Windows, valider les fins de ligne de style Unix ". C'est ce que je préférerais, car je vois Windows comme une exception dans ses caractères de fin de ligne et Windows corrige son propre problème de cette façon.
Si vous optez pour cette option, vous devez cependant corriger les fichiers actuels (car ils utilisent toujours les
CR
fins de ligne). Je l'ai fait en suivant ces étapes:Supprimez tous les fichiers du référentiel, mais pas de votre système de fichiers.
Ajoutez un
.gitattributes
fichier qui force certains fichiers à utiliser uneLF
fin de ligne as. Mettez ceci dans le fichier:Remplacez
.ext
par les extensions de fichier que vous souhaitez faire correspondre.Ajoutez à nouveau tous les fichiers.
Cela affichera des messages comme celui-ci:
Vous pouvez supprimer le
.gitattributes
fichier sauf si vous avez des utilisateurs Windows tenaces qui ne veulent pas utiliser l' option " Extraire le style Windows, valider les fins de ligne de style Unix ".Engagez-vous et poussez tout.
Supprimez et extrayez les fichiers applicables sur tous les systèmes où ils sont utilisés. Sur les systèmes Windows, assurez-vous qu'ils utilisent désormais l' option " Extraire le style Windows, valider les fins de ligne de style Unix ". Vous devez également le faire sur le système sur lequel vous avez exécuté ces tâches, car lorsque vous avez ajouté les fichiers, git a déclaré:
Vous pouvez faire quelque chose comme ceci pour supprimer les fichiers:
Et puis ceci pour les récupérer avec les terminaisons de ligne correctes:
Bien sûr, remplacer
.ext
par l'extension que vous souhaitez.Maintenant, votre projet utilise uniquement des
LF
caractères pour les fins de ligne, et les méchantsCR
caractères ne reviendront jamais :).L'autre option consiste à appliquer les fins de ligne de style Windows. Vous pouvez également utiliser le
.gitattributes
fichier pour cela.Plus d'informations: https://help.github.com/articles/dealing-with-line-endings/#platform-all
la source
View
->Line Endings
et cliquer surUnix
.^M
signifie exactement ? Est-ce une nouvelle ligne Windows ou Linux? Ou s'agit-il simplement d'une nouvelle ligne "différente" par rapport aux autres nouvelles lignes du fichier?git config --global core.autocrlf true
est exagéré, et l'anti-CR
campagne / anti- campagne semble tangentielle à la question.Il y en aura une avec Git 2.16 (T1 2018), car la
diff
famille de commandes " " a appris à ignorer les différences de retour chariot à la fin de la ligne.Voir commit e9282f0 (26 octobre 2017) de Junio C Hamano (
gitster
) .Aidé par: Johannes Schindelin (
dscho
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 10f65c2 , 27 nov.2017 )la source
git config --global core.autocrlf true
comme dans la réponse acceptée, cela répond plus directement à la question du PO: «Existe-t-il une option comme« traiter ^ M comme une nouvelle ligne en cas de divergence »?git version 2.20.1 (Apple Git-117)
mais l'ajout de la réponse core.pager de Jason Pyeron l'a corrigé. YMMV évidemment.TL; DR
Changez le
core.pager
en"tr -d '\r' | less -REX"
, pas le code sourceC'est pourquoi
Ces embêtants ^ M illustrés sont un artefact de la colorisation et du téléavertisseur. Elle est causée par
less -R
une option de pager git par défaut. (le pager par défaut de git estless -REX
)La première chose à noter est que
git diff -b
cela ne montrera pas les changements dans les espaces blancs (par exemple le \ r \ n vs \ n)installer:
Un test rapide pour créer un fichier Unix et modifier les fins de ligne ne montrera aucun changement avec
git diff -b
:Nous notons que forcer un tuyau à moins n'affiche pas le ^ M, mais active la couleur et
less -R
fait:Le correctif est indiqué en utilisant un tuyau pour supprimer le \ r (^ M) de la sortie:
Une alternative imprudente consiste à l'utiliser
less -r
, car elle passera par tous les codes de contrôle, pas seulement les codes de couleur.Si vous souhaitez simplement modifier directement votre fichier de configuration git, voici l'entrée à mettre à jour / ajouter:
la source
\r\n
fins de ligne et certains avaient des\n
fins de ligne (je ne sais pas si c'est pertinent); diffs du premier a montré le^M
dans les lignes modifiées (c'est-à-dire les+
lignes).core.autocrlf
a été défini surtrue
. La course à piedgit config core.pager "tr -d '\r' | less -REX"
s'est débarrassée des embêtants^M
. Merci!git diff -b
est ce que je cherchais, mais j'apprécie l'explication approfondie.[core]
section du fichier git "config" en ajoutantpager = tr -d '\\r' | less -REX
était la seule réponse qui a fonctionné pour moi. Je vous remercie!J'ai lutté avec ce problème pendant longtemps. De loin, la solution la plus simple est de ne pas se soucier des caractères ^ M et d'utiliser simplement un outil de diff visuel qui peut les gérer.
Au lieu de taper:
essayer:
la source
Dans mon cas, qu'est-ce que c'était cette commande:
Source: https://public-inbox.org/git/[email protected]/T/
la source
Comme indiqué par VonC, cela a déjà été inclus dans git 2.16+. Malheureusement, le nom de l'option (
--ignore-cr-at-eol
) diffère de celui utilisé par GNU diff auquel je suis habitué (--strip-trailing-cr
).Lorsque j'ai été confronté à ce problème, ma solution était d'appeler GNU diff au lieu du diff intégré de git, car mon git est plus ancien que 2.16. Je l'ai fait en utilisant cette ligne de commande:
Cela permet d'utiliser
--strip-trailing-cr
et toutes les autres options de diff GNU.Il y a aussi cette autre façon:
mais il n'utilise pas les paramètres de pager configurés, c'est pourquoi je préfère le premier.
la source