599 votes

git-diff pour ignorer ^ M

Dans un projet où certains des fichiers contiennent ^ M en tant que séparateurs de saut de ligne. Différer ces fichiers est apparemment impossible, puisque git-diff le voit comme le fichier entier est juste une seule ligne.

Comment se différencie-t-on avec la version précédente?

Y at-il une option comme "traiter ^ M en tant que nouvelle ligne lors de la différenciation"?

 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>
 


METTRE À JOUR:

maintenant j'ai écrit un script 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
 

484voto

nes1983 Points 7046

Github suggère que vous devriez assurez-vous d'utiliser uniquement \n comme un caractère de saut de ligne dans git-traitées repos. Il y a une option de conversion automatique:

$ git config --global core.autocrlf true

Bien sûr, ce qui est dit pour convertir crlf à la fl, alors que vous voulez convertir cr à lf. J'espère que cela fonctionne encore ...

Et puis de convertir vos fichiers:

# Remove everything from the index
$ git rm --cached -r .

# Re-add all the deleted files to the index
# You should get lots of messages like: "warning: CRLF will be replaced by LF in <file>."
$ git diff --cached --name-only -z | xargs -0 git add

# Commit
$ git commit -m "Fix CRLF"

de base.autocrlf est décrit sur la page de man.

434voto

Kyralessa Points 76456

Le développement sur Windows, j'ai rencontré ce problème lors de l'utilisation d' git tfs. Je l'ai résolu de cette façon:

git config --global core.whitespace cr-at-eol

Cela indiquera à Git que d'une fin de ligne CR n'est pas une erreur. En conséquence, ces ennuyeux ^M caractères n'apparaissent plus à la fin de lignes en git diff, git show, etc.

Il semble laisser les autres paramètres comme, par exemple, des espaces supplémentaires à la fin d'une ligne est-il toujours des erreurs (surligné en rouge) dans le diff.

(D'autres réponses ont fait allusion à cela, mais le dessus est exactement la façon de définir le paramètre. Pour définir le paramètre pour un seul projet, omettre l' --global.)

EDIT:

Après de nombreux la ligne de fin de travaux, j'ai eu la meilleure chance, lorsque vous travaillez sur un .NET de l'équipe, avec ces paramètres:

  • PAS de noyau.eol réglage
  • PAS de noyau.les espaces de réglage
  • PAS de noyau.autocrlf réglage
  • Lors de l'exécution de la commande Git programme d'installation pour Windows, vous obtiendrez de ces trois options:
    • La caisse de style Windows, commettre de style Unix, les fins de ligne <-- choisir celui-ci
    • La caisse en tant qu'-est, commettre de style Unix, les fins de ligne
    • La caisse en tant qu'-est, s'engager en tant qu'-est

Si vous avez besoin d'utiliser l'espace de configuration, vous devriez probablement l'activer uniquement sur une base par projet si vous avez besoin d'interagir avec TFS. Juste omettre l' --global:

git config core.whitespace cr-at-eol

Si vous avez besoin de supprimer certains de base.* paramètres, le plus simple est d'exécuter cette commande:

git config --global -e

Cela ouvre le mondial .gitconfig fichier dans un éditeur de texte, et vous pouvez facilement supprimer les lignes que vous souhaitez supprimer. (Ou vous pouvez mettre un '#' devant eux pour les mettre en commentaires.)

156voto

Jakub Narębski Points 87537

Essayez git diff --ignore-space-at-eol ou git diff --ignore-space-change ou git diff --ignore-all-space .

111voto

CyberShadow Points 13244

Regarde aussi:

 core.whitespace = cr-at-eol
 

14voto

Ian Wojtowicz Points 51

J'ai lutté avec ce problème pendant longtemps. De loin la solution la plus simple est de ne pas s'inquiéter des caractères ^ M et d'utiliser simplement un outil de diff visuel qui peut les manipuler.

Au lieu de taper:

 git diff <commitHash> <filename>
 

essayer:

 git difftool <commitHash> <filename>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X