web-dev-qa-db-fra.com

Statut Git ignore les fins de ligne/fichiers identiques/windows & environnement Linux/dropbox/mled

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.

45
Thorsten Niehues

Essayez de définir la valeur core.autocrlf comme ceci: 

git config --global core.autocrlf true
47
Saša Šijak

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.

30
Trashman

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.

8
winstonhong

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
3
shukshin.ivan

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:

  • correction par evandro777: quand le fichier a de l'espace dans le nom de fichier ou le répertoire
3
lepe

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-settingsline-ending-settings est l’un des suivants:

  • texte
  • binary (fichiers pour lesquels Git ne doit pas modifier les fins de ligne)

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"

1
user4603841