Lorsque vous effectuez une opération, git diff
il indique "Pas de retour à la fin du fichier" .
Ok, il n'y a pas de nouvelle ligne à la fin du fichier. Quel est le problème?
Quelle est la signification du message et qu'est-ce qu'il essaie de nous dire?
Réponses:
Cela indique que vous n'avez pas de nouvelle ligne (généralement
'\n'
, CR ou CRLF) à la fin du fichier.Autrement dit, le dernier octet (ou les octets si vous êtes sous Windows) dans le fichier n'est pas une nouvelle ligne.
Le message s'affiche car sinon il n'y a aucun moyen de faire la différence entre un fichier où il y a une nouvelle ligne à la fin et un où il n'y en a pas. Diff doit de toute façon sortir une nouvelle ligne, sinon le résultat serait plus difficile à lire ou à traiter automatiquement.
Notez que c'est un bon style de toujours mettre la nouvelle ligne comme dernier caractère si elle est autorisée par le format de fichier. En outre, par exemple, pour les fichiers d'en-tête C et C ++, il est requis par la norme de langage.
la source
Ce n'est pas seulement un mauvais style, cela peut entraîner un comportement inattendu lors de l'utilisation d'autres outils sur le fichier.
Voici
test.txt
:Il n'y a pas de caractère de nouvelle ligne sur la dernière ligne. Voyons combien de lignes se trouvent dans le fichier:
C'est peut-être ce que vous voulez, mais dans la plupart des cas, vous vous attendez probablement à ce qu'il y ait 2 lignes dans le fichier.
De plus, si vous souhaitez combiner des fichiers, il se peut qu'ils ne se comportent pas comme vous vous y attendez:
Enfin, cela rendrait vos différences légèrement plus bruyantes si vous deviez ajouter une nouvelle ligne. Si vous ajoutez une troisième ligne, elle affichera une modification sur la deuxième ligne ainsi que le nouvel ajout.
la source
La seule raison est qu'Unix avait historiquement une convention de tous les fichiers texte lisibles par l'homme se terminant par une nouvelle ligne. À l'époque, cela évitait un traitement supplémentaire lors de l'affichage ou de la jonction de fichiers texte et évitait de traiter les fichiers texte différemment des fichiers contenant d'autres types de données (par exemple, des données binaires brutes qui ne sont pas lisibles par l'homme).
En raison de cette convention, de nombreux outils de cette époque attendent la fin de la nouvelle ligne, y compris les éditeurs de texte, les outils différents et d'autres outils de traitement de texte. Mac OS X a été construit sur BSD Unix et Linux a été développé pour être compatible Unix, de sorte que les deux systèmes d'exploitation ont hérité des mêmes conventions, comportements et outils.
Windows n'a pas été développé pour être compatible Unix, il n'a donc pas la même convention, et la plupart des logiciels Windows fonctionneront très bien sans retour à la ligne.
Mais, depuis que Git a été développé pour Linux en premier, et beaucoup de logiciels open source sont construits sur des systèmes compatibles Unix comme Linux, Mac OS X, FreeBSD, etc., la plupart des communautés open source et leurs outils (y compris les langages de programmation) continuent suivre ces conventions.
Il y a des raisons techniques qui avaient du sens en 1971, mais à cette époque, c'est surtout la convention et le maintien de la compatibilité avec les outils existants.
la source
Si vous ajoutez une nouvelle ligne de texte à la fin du fichier existant qui n'en a pas déjà
newline character
à la fin, le diff affichera l'ancienne dernière ligne comme ayant été modifiée, même si conceptuellement elle ne l'était pas.C'est au moins une bonne raison d'ajouter un
newline character
à la fin.Exemple
Un fichier contient:
Hexdump:
Vous le modifiez maintenant en
Hexdump:
Le diff git affichera:
En d'autres termes, il montre une différence plus importante que celle qui s'est produite conceptuellement. Cela montre que vous avez supprimé la ligne
}
et ajouté la ligne}\n
. C'est en fait ce qui s'est passé, mais ce n'est pas ce qui s'est passé conceptuellement , donc cela peut être déroutant.la source
Cela indique simplement que la fin du fichier n'a pas de nouvelle ligne. Ce n'est pas une catastrophe, c'est juste un message pour préciser qu'il n'y en a pas quand on regarde un diff dans la ligne de commande.
la source
La raison pour laquelle cette convention a été mise en pratique est que sur les systèmes d'exploitation de type UNIX, un caractère de nouvelle ligne est traité comme un terminateur de ligne et / ou une limite de message (cela inclut la canalisation entre les processus, la mise en mémoire tampon de ligne, etc.).
Considérez, par exemple, qu'un fichier avec juste un caractère de nouvelle ligne est traité comme une seule ligne vide. Inversement, un fichier d'une longueur de zéro octet est en fait un fichier vide avec zéro ligne. Cela peut être confirmé selon la
wc -l
commande.Dans l'ensemble, ce comportement est raisonnable car il n'y aurait pas d'autre moyen de faire la distinction entre un fichier texte vide et un fichier texte avec une seule ligne vide si le
\n
caractère était simplement un séparateur de ligne plutôt qu'un terminateur de ligne. Ainsi, les fichiers texte valides doivent toujours se terminer par un caractère de nouvelle ligne. La seule exception est si le fichier texte est destiné à être vide (pas de lignes).la source
Il y a une chose que je ne vois pas dans les réponses précédentes. Un avertissement concernant l'absence de fin de ligne peut être un avertissement lorsqu'une partie d'un fichier a été tronquée. Cela pourrait être un symptôme de données manquantes.
la source
Le problème principal est ce que vous définissez la ligne et si la séquence de caractères de fin en ligne fait partie de la ligne ou non. Les éditeurs basés sur UNIX (tels que VIM) ou les outils (tels que Git) utilisent la séquence de caractères EOL comme terminateur de ligne, c'est donc une partie de la ligne. C'est similaire à l'utilisation du point-virgule (;) en C et Pascal. En C, le point-virgule termine les instructions, en Pascal il les sépare.
la source
En fait, cela pose un problème car les fins de ligne sont automatiquement modifiées les fichiers de nettoyage sans y apporter de modifications. Voir ce post pour la résolution.
git remplaçant LF par CRLF
la source
Les fichiers sources sont souvent concaténés par des outils (C, C ++: fichiers d'en-tête, Javascript: bundlers). Si vous omettez le caractère de nouvelle ligne, vous pouvez introduire des bugs désagréables (où la dernière ligne d'une source est concaténée avec la première ligne du fichier source suivant). Espérons que tous les outils de concaténation du code source insèrent une nouvelle ligne entre les fichiers concaténés de toute façon, mais cela ne semble pas toujours être le cas.
Le nœud du problème est - dans la plupart des langues, les sauts de ligne ont une signification sémantique et la fin de fichier n'est pas une alternative définie par la langue pour le caractère de retour à la ligne. Vous devez donc terminer chaque instruction / expression par un caractère de nouvelle ligne - y compris la dernière.
la source
//
commentaire de style au milieu du code.Votre fichier d'origine n'avait probablement pas de caractère de nouvelle ligne.
Cependant, certains éditeurs comme gedit dans linux ajoutent silencieusement une nouvelle ligne à la fin du fichier. Vous ne pouvez pas vous débarrasser de ce message lorsque vous utilisez ce type d'éditeurs.
Ce que j'ai essayé de surmonter ce problème est d'ouvrir un fichier avec l'éditeur de code Visual Studio
Cet éditeur affiche clairement la dernière ligne et vous pouvez supprimer la ligne comme vous le souhaitez.
la source
Pour ce que ça vaut, je l'ai rencontré lorsque j'ai créé un projet IntelliJ sur un Mac, puis déplacé le projet sur ma machine Windows. J'ai dû ouvrir manuellement chaque fichier et modifier le paramètre d'encodage en bas à droite de la fenêtre IntelliJ. Cela n'arrive probablement pas à la plupart des personnes qui ont lu cette question, mais cela aurait pu m'économiser quelques heures de travail ...
la source