Quelle est la meilleure stratégie de manipulation CRLF (carriage return, line feed) avec Git?

j'ai essayé de propager des fichiers avec des lignes de terminaison CRLF, mais ça a échoué.

j'ai passé toute une journée de travail sur mon ordinateur Windows en essayant différentes stratégies et j'ai été presque attiré d'arrêter d'essayer d'utiliser Git et plutôt essayer Mercurial .

veuillez partager une seule pratique exemplaire par réponse.

550
demandé sur Peter Mortensen 2008-10-05 00:39:28

9 réponses

presque quatre ans après avoir posé cette question, j'ai enfin trouvé une réponse qui me satisfait complètement !

voir les détails dans GitHub: aide ' s guide to Traiter avec des fins de ligne .

Git vous permet de définir les propriétés de fin de ligne pour un repo direct using the text attribut in the .gitattributes "151990920 de fichier". Ce fichier est engagé dans la prise en compte et l'annulation du paramètre core.autocrlf , vous permettre d'assurer un comportement cohérent pour tous les utilisateurs indépendamment de leurs paramètres git.

et donc

L'avantage, c'est que votre fin de ligne la configuration voyage maintenant avec votre dépôt et vous ne vous inquiétez pas si oui ou non collaborateurs avoir le bon mondial paramètre.

Voici un exemple de .gitattributes fichier

# Auto detect text files and perform LF normalization
*        text=auto

*.cs     text diff=csharp
*.java   text diff=java
*.html   text diff=html
*.css    text
*.js     text
*.sql    text

*.csproj text merge=union
*.sln    text merge=union eol=crlf

*.docx   diff=astextplain
*.DOCX   diff=astextplain

# absolute paths are ok, as are globs
/**/postinst* text eol=lf

# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol=lf

Il ya une pratique collection de prêt à l'emploi .gitattributes fichiers pour les langages de programmation les plus populaires. Il est utile d'obtenir vous avez commencé.

une fois que vous avez créé ou ajusté votre .gitattributes , vous devez effectuer une fois pour toutes terminaisons de ligne re-normalisation .

notez que l'application Github Desktop peut suggérer et créer un fichier .gitattributes après avoir ouvert le compte git de votre projet dans l'application. Pour essayer cela, cliquez sur l'icône d'engrenage (en haut à droite) > paramètres du Référentiel ... > Fin de ligne, et les attributs. Il vous sera demandé d'ajouter le recommandé .gitattributes et si vous l'acceptez, l'application peut également effectuer une normalisation de tous les fichiers dans votre référentiel.

enfin, le esprit la fin de votre ligne article fournit plus de contexte et explique comment Git a évolué sur les questions à portée de main. Je considère que ce lecture obligatoire .

vous avez probablement des utilisateurs dans votre équipe qui utilisent EGit ou JGit (des outils comme Eclipse et TeamCity les utilisent) pour engager leurs changements. Alors vous n'avez pas de chance, comme @gatinueta expliqué dans les commentaires de cette réponse:

ce réglage ne vous satisfera pas complètement si vous avez des personnes qui travaillent avec Egit ou JGit dans votre équipe, puisque ces outils vont tout simplement ignorer .gitattributes et heureusement vérifier dans les fichiers CRLF https://bugs.eclipse.org/bugs/show_bug.cgi?id=342372

un truc pourrait être de leur faire commettre leurs changements dans un autre client, dire SourceTree . Notre équipe à l'époque préférait cet outil à Eclipse EGit pour de nombreux cas d'utilisation.

qui a dit que le logiciel est facile? :- /

690
répondu Daniel Jomphe 2016-06-07 14:04:37

ne convertissez pas les fins de ligne. Ce n'est pas le travail du VCS d'interpréter les données, juste de les stocker et de les mettre en version. Chaque éditeur de texte moderne peut lire les deux types de terminaisons de ligne de toute façon.

102
répondu John Millikin 2008-10-04 20:42:06

Vous veulent presque toujours autocrlf=input sauf si vous savez vraiment ce que vous faites.

supplémentaires ci-dessous:

il devrait être soit core.autocrlf=true si vous aimez Fin DOS ou core.autocrlf=input si vous préférez unix-retours à la ligne. Dans les deux cas, votre dépôt Git Je n'ai que le LF, ce qui est la bonne chose à faire. La seule l'argument pour core.autocrlf=false était que automatique heuristique peut mal détecter certains binaires en tant que texte et alors votre tuile sera corrompue. Si, L'option core.safecrlf a été introduite pour avertir un utilisateur si un changement irréversible se produit. En fait, il y a deux possibilités de changements irréversibles -- mixte ligne-se terminant en fichier texte, dans cette normalisation est désirable, alors cet avertissement peut être ignoré, ou (très peu probable) que Git a mal détecté votre fichier binaire sous forme de texte. Ensuite, vous devez utiliser les attributs pour indiquer à Git que ce fichier est binaire.

le paragraphe ci-dessus a été tiré à l'origine d'un fil sur gmane.org mais il s'est effondré depuis.

76
répondu Cory 2017-09-20 09:02:55

deux stratégies alternatives à get consistent à propos des terminaisons de ligne dans des environnements mixtes (Microsoft + Linux + Mac):

A. Mondial par Tous les Référentiels d'Installation

1) convertir en un seul format

find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'

2) Régler core.autocrlf à input le Linux / UNIX ou true sur MS Windowns (dépôt ou global)

git config --global core.autocrlf input

3) [ optionnel ] mettre core.safecrlf à true (pour arrêter) ou warn (pour chanter:) pour ajouter une garde supplémentaire en comparant si la transformation newline inversée résulterait dans le même fichier

git config --global core.safecrlf true



B. Ou par le Référentiel de Configuration

1) convertir en un seul format

find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'

2) Ajouter .gitattributes fichier à votre dépôt

echo "* text=auto" > .gitattributes
git add .gitattributes
git commit -m 'adding .gitattributes for unified line-ending'

ne vous inquiétez pas pour vos fichiers binaires - Git devrait être assez intelligent à leur sujet.


en savoir plus sur safecrlf/autocrlf variables

53
répondu lukmdo 2017-05-23 11:33:24

essayez de définir l'option de configuration core.autocrlf à true . Consultez également l'option core.safecrlf .

en fait, on dirait que core.safecrlf pourrait déjà être placé dans votre dépôt, parce que (emphasis mine):

si ce n'est pas le cas pour le réglage actuel de core.autocrlf, git rejettera le fichier .

Si c'est le cas, alors vous vérifiez que votre éditeur de texte est configuré pour utiliser les fins de ligne de manière cohérente. Vous rencontrerez probablement des problèmes si un fichier texte contient un mélange de fins de ligne LF et CRLF.

enfin, je pense que la recommandation de simplement "utiliser ce qui vous est donné" et d'utiliser LF terminé lignes sur Windows va causer plus de problèmes qu'il résout. Git a les options ci-dessus pour essayer de gérer les fins de ligne d'une manière raisonnable, il est donc logique de les utiliser.

11
répondu Greg Hewgill 2008-10-05 03:50:12

en utilisant core.autocrlf=false a empêché tous les fichiers d'être marqués à jour dès que je les ai vérifiés dans mon projet Visual Studio 2010 . Les deux autres membres de l'équipe de développement utilisent également des systèmes Windows de sorte qu'un environnement mixte n'est pas entré en jeu, et pourtant les paramètres par défaut qui sont venus avec le dépôt ont toujours marqué tous les fichiers comme mis à jour immédiatement après le clonage.

je suppose que l'essentiel est de trouver ce que le réglage CRLF fonctionne pour votre environnement. D'autant plus que dans de nombreux autres dépôts sur nos boîtes Linux, le paramétrage autocrlf = true produit de meilleurs résultats.

20+ ans plus tard et nous sommes toujours confrontés à la ligne de mettre fin aux disparités entre les os... triste.

9
répondu Lance Cleveland 2016-02-05 16:08:23

ce sont les deux options pour Windows et studio visuel utilisateurs qui partagent le code avec Mac ou Linux utilisateurs. Pour une explication plus détaillée, lisez le gitattributes manual .

* texte=auto

dans votre dossier .gitattributes ajouter:

*   text=auto

cela normalisera tous les fichiers avec la fin de la ligne LF dans le repo.

et selon votre système d'exploitation ( core.eol paramètre), les fichiers dans l'arbre de travail sera normalisé à LF pour les systèmes basés sur Unix ou CRLF pour les systèmes Windows.

C'est la configuration que Microsoft.NET repos utiliser.

exemple:

Hello\r\nWorld

Sera normalisé dans le repo toujours comme:

Hello\nWorld

sur la caisse, l'arbre de travail dans les fenêtres sera converti en:

Hello\r\nWorld

sur la caisse, l'arbre de travail dans Mac sera laissé comme:

Hello\nWorld

Note: Si votre repo contient déjà des fichiers non normalisés, git status affichera ces fichiers tels que complètement modifiés la prochaine fois que vous les modifiez, et il pourrait être pénible pour d'autres utilisateurs de fusionner leurs des modifications plus tard. Voir rafraîchir un dépôt après avoir changé les fins de ligne pour plus d'information.

de base.autocrlf = true

si text est non spécifié dans le fichier .gitattributes , Git utilise la variable de configuration core.autocrlf pour déterminer si le fichier doit être converti.

pour les utilisateurs de Windows, git config --global core.autocrlf true est une excellente option parce que:

    Les fichiers
  • sont normalisés en LF terminaisons de ligne seulement lorsqu'ils sont ajoutés à la pension. S'il y a des fichiers non normalisés dans la mise à jour, ce paramètre ne les touchera pas.
  • tous les fichiers texte sont convertis en terminaisons de ligne CRLF dans le répertoire de travail.

le problème avec cette approche est que:

  • si vous êtes un utilisateur de Windows avec autocrlf = input , vous devez voir un tas de fichiers avec la fin de la ligne LF . Pas de risque pour le reste de l'équipe, car vos commits seront toujours normalisés avec les fins de ligne LF .
  • si vous êtes un utilisateur de Windows avec core.autocrlf = false , vous verrez un tas de fichiers avec des fins de ligne LF et vous pouvez introduire des fichiers avec des fins de ligne CRLF dans la pension.
  • la plupart des utilisateurs Mac utilisent autocrlf = input et peuvent obtenir des fichiers avec CRLF fin de fichier, probablement des utilisateurs de Windows avec core.autocrlf = false .
6
répondu kiewic 2017-08-24 14:54:58

ce n'est qu'une solution de contournement solution:

dans les cas normaux, utilisez les solutions qui sont livrées avec git. Ces grands travaux dans la plupart des cas. Forcez à LF si vous partagez le développement sur les systèmes Windows et Unix en paramétrant .gitattributes .

dans mon cas, il y avait plus de 10 programmeurs développant un projet dans Windows. Ce projet a été vérifié avec le CRLF et il n'y avait pas option pour forcer à la FL.

certains paramètres ont été écrits en interne sur ma machine sans aucune influence sur le format LF; ainsi, certains fichiers ont été globalement changés en LF à chaque petit changement de fichier.

ma solution:

Windows-Machines: Laissez tout ce qu'il est. Ne vous souciez de rien, puisque vous êtes un développeur par défaut de windows 'Lone wolf' et que vous devez gérer comme ceci: "il n'y a pas d'autre système dans le monde entier, est-il?"

Unix-Machines

  1. ajouter les lignes suivantes à la section [alias] d'une configuration. Cette commande Liste tous les fichiers modifiés (i.e. modified / new):

    lc = "!f() { git status --porcelain \
                 | egrep -r \"^(\?| ).\*\(.[a-zA-Z])*\" \
                 | cut -c 4- ; }; f "
    
  2. Convertir tous les changé fichiers en format dos:

    unix2dos $(git lc)
    
  3. facultatif ...

    1. Créer un git crochet pour cette action d'automatiser ce processus de

    2. utilisez des paramètres et incluez-les et modifiez la fonction grep pour ne correspondre qu'à des noms de fichiers particuliers, par exemple:

      ... | egrep -r "^(\?| ).*\.(txt|conf)" | ...
      
    3. N'hésitez pas à le rendre encore plus pratique en utilisant un raccourci supplémentaire:

      c2dos = "!f() { unix2dos $(git lc) ; }; f "
      

      ... et tirez sur les converties en tapant

      git c2dos
      
5
répondu John Rumpel 2017-08-26 18:51:58

j'ai passé des heures à trouver la meilleure utilisation possible de .gitattributes , pour finalement réaliser, que je ne peux pas compter sur elle.

Malheureusement, tant que les éditeurs basés sur JGit existent (qui ne peuvent pas gérer .gitattributes correctement), la solution sûre est de forcer LF partout, même au niveau de l'éditeur.

utiliser les désinfectants suivants anti-CRLF .

--- mise à jour - - -

même si vous ne voulez pas utiliser la stratégie ci-dessus, la commande suivante est votre ami ( Note: sur les clients windows ne fonctionne que par git-bash et sur les clients linux que si compilé en utilisant --with-libpcre dans ./configure ).

# Print all files that have been committed with CRLF (more correctly that contain CR), so that you normalize them.
git grep -I --files-with-matches --perl-regexp '\r' HEAD

un exemple douloureux :

netbeans 8.2 (sur windows), va commettre à tort tous les fichiers texte avec CRLFs sur repo , sauf si vous avez explicitement set core.autocrlf comme global . Cela contredit le comportement standard du client git, et provoque beaucoup de problèmes plus tard, alors que mise à jour/fusion. C'est ce qui rend certains fichiers différents (bien qu'ils ne le soient pas) même lorsque vous revenez en arrière .

Le même comportement dans netbeans se produit même si vous avez ajouté correct .gitattributes à votre projet.

L'utilisation de la commande ci-dessus après un commit, vous aidera au moins à détecter tôt si votre git repo a des problèmes de fin de ligne.

1
répondu Marinos An 2017-11-29 13:43:03