Comment je fais
statut git
ignorer les différences de fin de ligne?
Informations de fond:
J'utilise au hasard Windows et Linux pour travailler sur le projet. Le projet est dans Dropbox.
J'ai trouvé beaucoup de choses sur comment faire en sorte que git diff ignore les fins de ligne. Depuis que j'utilise meld git diff ouvre meld pour chaque fichier. Et meld dit "fichier identique".
Alors, comment puis-je éviter cela. Git ne devrait ouvrir la fusion que pour les fichiers modifiés . Et le statut de git ne devrait pas signaler les fichiers comme modifiés si seule la fin du fichier est différente.
EDIT: Cause:
Cela est dû à ce paramètre sous Windows
core.autocrlf true
J'ai donc vérifié la copie de travail sous Linux et défini la valeur core.autocrlf sur Windows.
Il serait toujours agréable de savoir comment faire en sorte que le statut de git ignore les nouvelles lignes.
Essayez de définir la valeur core.autocrlf comme ceci:
git config --global core.autocrlf true
Utilisez .gitattributes à la place, avec le paramètre suivant:
# Ignore all differences in line endings
* -crlf
Les fichiers .gitattributes se trouvent dans le même répertoire que votre fichier global .gitconfig. Si .gitattributes n'existe pas, ajoutez-le à ce répertoire. Après avoir ajouté/modifié des .gitattributes, vous devrez procéder à une réinitialisation matérielle du référentiel afin d'appliquer correctement les modifications aux fichiers existants.
Problème lié aux commandes git sur le système d'exploitation Windows:
$ git add --all
avertissement: LF sera remplacé par CRLF dans ...
Le fichier aura sa fin de ligne d'origine dans votre répertoire de travail.
Résolution :
$ git config --global core.autocrlf false
$ git add --all
Aucun message d'avertissement ne s'affiche.
J'utilise Windows et Linux, mais la solution core.autocrlf true
ne m'a pas aidé. Je n'ai même rien eu changé après git checkout <filename>
.
J'utilise donc une solution de contournement pour remplacer git status
- gitstatus.sh
#!/bin/bash
git status | grep modified | cut -d' ' -f 4 | while read x; do
x1="$(git show HEAD:$x | md5sum | cut -d' ' -f 1 )"
x2="$(cat $x | md5sum | cut -d' ' -f 1 )"
if [ "$x1" != "$x2" ]; then
echo "$x NOT IDENTICAL"
fi
done
Je viens de comparer md5sum
d'un fichier et de son frère dans le référentiel.
Exemple de sortie:
$ ./gitstatus.sh
application/script.php NOT IDENTICAL
application/storage/logs/laravel.log NOT IDENTICAL
J'ai créé un script pour ignorer les différences de fin de ligne:
Il affichera les fichiers qui ne sont pas ajoutés à la liste de validation et qui ont été modifiés (après avoir ignoré les différences dans les fins de ligne). Vous pouvez ajouter l'argument "add" pour ajouter ces fichiers à votre commit.
#!/usr/bin/Perl
# Usage: ./gitdiff.pl [add]
# add : add modified files to git
use warnings;
use strict;
my ($auto_add) = @ARGV;
if(!defined $auto_add) {
$auto_add = "";
}
my @mods = `git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-`;
chomp(@mods);
for my $mod (@mods) {
my $diff = `git diff -b $mod 2>/dev/null`;
if($diff) {
print $mod."\n";
if($auto_add eq "add") {
`git add $mod 2>/dev/null`;
}
}
}
Code source: https://github.com/lepe/scripts/blob/master/gitdiff.pl
Mises à jour:
Cette réponse semble pertinente puisque le PO fait référence à la nécessité d’une solution multi-OS. Ce Github article d'aide détaille les approches disponibles pour la gestion des lignes se terminant entre systèmes d'exploitation. Il existe des approches globales et par pension pour la gestion des fins de ligne cross-os.
Approche globale
Configurez la gestion des fins de ligne Git sous Linux ou OS X:
git config --global core.autocrlf input
Configurez la gestion des fins de ligne Git sous Windows:
git config --global core.autocrlf true
Approche par rapport:
À la racine de votre référentiel, créez un fichier .gitattributes
et définissez les paramètres de fin de ligne pour vos fichiers de projet, ligne par ligne au format suivant: path_regex line-ending-settings
où line-ending-settings
est l’un des suivants:
La valeur text
peut être configurée davantage pour indiquer à Git comment gérer les fins de ligne pour les fichiers correspondants:
text
- Modifie les fins de ligne en fins de ligne natives du système d'exploitation.text eol=crlf
- Convertit les fins de ligne en CRLF
à la caisse.text eol=lf
- Convertit les fins de ligne en LF
à la caisse.text=auto
- Défaut sensible laissant la gestion de la ligne à la discrétion de Git.Voici le contenu d'un exemple de fichier .gitattributes:
# Set the default behavior for all files.
* text=auto
# Normalized and converts to
# native line endings on checkout.
*.c text
*.h text
# Convert to CRLF line endings on checkout.
*.sln text eol=crlf
# Convert to LF line endings on checkout.
*.sh text eol=lf
# Binary files.
*.png binary
*.jpg binary
Plus d'informations sur la façon d'actualiser votre référentiel après avoir modifié les paramètres de fin de ligne ici . Tldr:
sauvegardez vos fichiers avec Git, supprimez tous les fichiers de votre référentiel (sauf le répertoire .git), puis restaurez tous les fichiers en même temps . Enregistrez vos fichiers actuels dans Git, de sorte qu'aucun de vos travaux ne soit perdu.
git add . -u
git commit -m "Saving files before refreshing line endings"
Supprimez l'index et forcez Git à réanalyser le répertoire de travail.
rm .git/index
Réécrivez l'index Git pour récupérer toutes les nouvelles fins de ligne.
git reset
Affiche les fichiers normalisés réécrits.
Dans certains cas, c'est tout ce qui reste à faire. D'autres peuvent avoir besoin d'effectuer les étapes supplémentaires suivantes:
git status
Rajoutez tous vos fichiers modifiés et préparez-les pour un commit. C'est votre chance d'inspecter quels fichiers, le cas échéant, n'ont pas été modifiés.
git add -u
Il est parfaitement sûr de voir ici beaucoup de messages indiquant [s] "avertissement: CRLF sera remplacé par LF dans le fichier".
Réécrivez le fichier .gitattributes.
git add .gitattributes
Commettez les modifications dans votre référentiel.
git commit -m "Normalize all the line endings"