Près de 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: guide de l' aide pour
gérer les fins de ligne .
Git vous permet de définir les propriétés de fin de ligne pour un dépôt directement à l'aide de l' attribut text du
.gitattributes
fichier. Ce fichier est validé dans le référentiel et remplace le core.autocrlf
paramètre, ce qui vous permet d'assurer un comportement cohérent pour tous les utilisateurs, quels que soient leurs paramètres git.
Et ainsi
L'avantage de ceci est que votre configuration de fin de ligne voyage maintenant avec votre référentiel et vous n'avez pas à vous soucier de savoir si les collaborateurs ont ou non les paramètres globaux appropriés.
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 existe une collection pratique de fichiers .gitattributes prêts à l'emploi pour les langages de programmation les plus populaires. Il est utile de vous aider à démarrer.
Une fois que vous avez créé ou ajusté votre .gitattributes
, vous devez effectuer une normalisation une fois pour toutes des fins de ligne .
Notez que l' application GitHub Desktop peut suggérer et créer un .gitattributes
fichier après avoir ouvert le référentiel Git de votre projet dans l'application. Pour l'essayer, cliquez sur l'icône d'engrenage (dans le coin supérieur droit)> Paramètres du référentiel ...> Terminaisons et attributs de ligne. Il vous sera demandé d'ajouter le recommandé .gitattributes
et si vous êtes d'accord, l'application effectuera également une normalisation de tous les fichiers de votre référentiel.
Enfin, l'article Mind the End of Your Line fournit plus de contexte et explique comment Git a évolué sur les sujets traités. Je considère cette lecture nécessaire .
Vous avez probablement des utilisateurs dans votre équipe qui utilisent EGit ou JGit (des outils comme Eclipse et TeamCity les utilisent) pour valider leurs modifications. Ensuite, vous n'avez pas de chance, comme @gatinueta l'a expliqué dans les commentaires de cette réponse:
Ce paramètre ne vous satisfera pas complètement si vous avez des personnes travaillant avec Egit ou JGit dans votre équipe, car ces outils ignoreront simplement .gitattributes et archiveront volontiers les fichiers CRLF https://bugs.eclipse.org/bugs/show_bug.cgi? id = 342372
Une astuce pourrait être de les faire valider leurs modifications dans un autre client, selon SourceTree . Notre équipe a alors préféré cet outil à EGit d'Eclipse pour de nombreux cas d'utilisation.
Qui a dit que le logiciel était facile? : - /
.gitattributes
?.gitattributes
que GitHub pour Windows suggère pour votre projet? J'ai installé GitHub pour Windows, démarré la version GUI et n'ai pu trouver aucune option liée aux.gitattributes
suggestions.core.autocrlf = false
- je préfère LF partout, mais certains des outils Windows comme Visual Studio insistent sur les terminaisons CRLF dans certains fichiers (et même les mélanger dans quelques-uns ..); ne pas raccrocher les fins de ligne est l'option la plus sûre. Si vous savez ce que vous faites, j'utiliserais et ferais probablementcore.autocrlf = input
des exceptions pour les projets sous Windows que vous savez sensibles aux fins de ligne. Comme d'autres le soulignent, chaque éditeur de texte décent prend désormais en charge les terminaisons LF. En fait, je pense que celacore.autocrlf = true
peut probablement causer plus de problèmes qu'il n'en empêche.Ne convertissez pas les fins de ligne. Ce n'est pas le travail du VCS d'interpréter les données - il suffit de les stocker et de les versionner. Tout éditeur de texte moderne peut de toute façon lire les deux types de fins de ligne.
la source
Vous voulez presque toujours à
autocrlf=input
moins que vous sachiez vraiment ce que vous faites.Un contexte supplémentaire ci-dessous:
Le paragraphe ci-dessus a été initialement extrait d'un fil de discussion sur gmane.org, mais il a depuis disparu.
la source
core.autocrlf=input
est la réponse canonique. Pour la plupart des cas d'utilisation,core.autocrlf=true
etcore.autocrlf=false
sont trop zélés (... de manière opposée mais tout aussi terrible, bien sûr) et donc intrinsèquement destructifs. "Git pour Windows" aurait vraiment dû être livré avec "Checkout tel quel, valider les fins de ligne de style Unix" (c'est-à-direcore.autocrlf=input
) comme stratégie de nouvelle ligne par défaut. Ce ne fut pas le cas. Nous voici donc ici - en frickin '2015 - toujours en débat sans fin.Deux stratégies alternatives pour obtenir une cohérence sur les fins de ligne dans les environnements mixtes (Microsoft + Linux + Mac):
A. Global Configuration par tous les référentiels
1) Convertissez tout en un seul format
2) Mettre
core.autocrlf
àinput
sous Linux / UNIX outrue
sur MS Windows (dépôt ou global)3) [Facultatif] défini
core.safecrlf
surtrue
(pour arrêter) ouwarn
(pour chanter :) pour ajouter une garde supplémentaire en comparant si la transformation de nouvelle ligne inversée entraînerait le même fichierB. Ou par configuration de référentiel
1) Convertissez tout en un seul format
2) Ajoutez un
.gitattributes
fichier à votre référentielNe vous inquiétez pas pour vos fichiers binaires - Git devrait être assez intelligent à leur sujet.
En savoir plus sur les variables safecrlf / autocrlf
la source
dos2unix
est un outil en ligne de commande que, selon le système, vous devrez peut-être installer en plusdos2unix
- il y a un risque de corruption.git/index
et nous n'avons pas besoin de l'appliquer à chaque fichier. Il est préférable d'utiliser quelque chose commefind ./ -name "*.html"
et de spécifier les fichiers auxquels vous souhaitez l'appliquer.find
lignes, sachezdos2unix
que celui qui est livré avec Git pour Windows a un comportement particulier (IMO idiot et dangereux), sans arguments: au lieu de passer à UNIX, il bascule le format de nouvelle ligne (DOS <-> UNIX )Essayez de définir l'
core.autocrlf
option de configuration surtrue
. Jetez également un œil à l'core.safecrlf
option.En fait, il semble que vous
core.safecrlf
ayez déjà été défini dans votre référentiel, car (c'est moi qui souligne):Si tel est le cas, vous voudrez peut-être vérifier 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 qu'on vous donne" et d'utiliser des lignes terminées LF sous Windows causera plus de problèmes qu'elle n'en résout. Git a les options ci-dessus pour essayer de gérer les fins de ligne de manière sensée, il est donc logique de les utiliser.
la source
L'utilisation a
core.autocrlf=false
empêché tous les fichiers d'être marqués comme mis à jour dès que je les ai extraits dans mon Visual Studio 2010 projet . Les deux autres membres de l'équipe de développement utilisent également des systèmes Windows, donc un environnement mixte n'est pas entré en jeu, mais les paramètres par défaut fournis avec le référentiel marquaient toujours tous les fichiers comme mis à jour immédiatement après le clonage.Je suppose que l'essentiel est de trouver quel paramètre CRLF fonctionne pour votre environnement. D'autant plus que dans de nombreux autres référentiels sur nos boîtes Linux, le réglage
autocrlf = true
produit de meilleurs résultats.Plus de 20 ans plus tard et nous avons toujours affaire à des disparités de fin de ligne entre les systèmes d'exploitation ... triste.
la source
Ce sont les deux options pour les utilisateurs Windows et Visual Studio qui partagent du code avec des utilisateurs Mac ou Linux . Pour une explication détaillée, lisez le manuel de gitattributes .
* text = auto
Dans le
.gitattributes
fichier de votre référentiel, ajoutez:Cela normalisera tous les fichiers avec des
LF
fins de ligne dans le référentiel.Et selon votre système d'exploitation (
core.eol
paramètre), les fichiers de l'arborescence de travail seront normalisésLF
pour les systèmes basés sur Unix ouCRLF
pour les systèmes Windows.Il s'agit de la configuration utilisée par les référentiels Microsoft .NET .
Exemple:
Sera normalisé dans le repo toujours comme:
Au moment du paiement, l'arborescence de travail de Windows sera convertie en:
Lors du paiement, l'arborescence de travail dans Mac sera laissée comme:
core.autocrlf = true
Si
text
n'est pas spécifié dans le.gitattributes
fichier, Git utilise lecore.autocrlf
variable de configuration pour déterminer si le fichier doit être converti.Pour les utilisateurs de Windows,
git config --global core.autocrlf true
c'est une excellente option car:LF
fins de ligne uniquement lorsqu'ils sont ajoutés au référentiel. S'il y a des fichiers non normalisés dans le référentiel, ce paramètre ne les touchera pas.CRLF
fins de ligne dans le répertoire de travail.Le problème avec cette approche est que:
autocrlf = input
, vous verrez un tas de fichiers avec desLF
fins de ligne. Pas un danger pour le reste de l'équipe, car vos commits seront toujours normalisés avec desLF
fins de ligne.core.autocrlf = false
, vous verrez un tas de fichiers avec desLF
fins de ligne et vous pouvez introduire des fichiers avec desCRLF
fins de ligne dans le référentiel.autocrlf = input
et peuvent obtenir des fichiers avecCRLF
des fins de fichier, probablement des utilisateurs de Windows aveccore.autocrlf = false
.la source
git config --global core.autocrl true
. Tu veux diregit config --global core.autocrlf true
.--- UPDATE 3 --- (n'entre pas en conflit avec UPDATE 2)
Étant donné que les utilisateurs de Windows préfèrent travailler sur
CRLF
et les utilisateurs de Linux / Mac préfèrent travailler sur desLF
fichiers texte. Fournir la réponse du point de vue d'un mainteneur de référentiel :Pour moi, la meilleure stratégie (moins de problèmes à résoudre) est de conserver tous les fichiers texte avec
LF
git repo à l' intérieur même si vous travaillez sur un projet Windows uniquement. Ensuite, donnez aux clients la liberté de travailler sur le style de fin de ligne de leur préférence , à condition qu'ils choisissent unecore.autocrlf
valeur de propriété qui respectera votre stratégie (LF au dépôt) tout en préparant les fichiers à valider.La mise en scène est ce que beaucoup de gens confondent lorsqu'ils essaient de comprendre comment fonctionnent les stratégies de nouvelle ligne . Il est essentiel de comprendre les points suivants avant de choisir la valeur correcte pour la
core.autocrlf
propriété:.git/
sous-répertoire avec fins de ligne convertis ( en fonction de lacore.autocrlf
valeur de votre configuration client). Tout cela se fait localement.core.autocrlf
est comme fournir une réponse à la question (exactement la même question sur tous les OS):false:
" ne faites rien de ce qui précède ",input:
" faire seulement b "true
: " faire a et b "Heureusement
core.autocrlf: true
:, linux / mac:)core.autocrlf: false
seront compatibles avec la stratégie LF-only-repo .Signification : les clients Windows seront par défaut convertis en CRLF lors de l'extraction du référentiel et convertis en LF lors de l'ajout pour validation. Et les clients Linux ne feront par défaut aucune conversion. Ceci conserve théoriquement votre dépôt uniquement.
Malheureusement:
core.autocrlf
valeur gitcore.autocrlf=false
et ajoutent un fichier avec CRLF pour la validation.Pour détecter les fichiers texte non lf ASAP commis par les clients ci-dessus, vous pouvez suivre ce qui est décrit sur --- mise à jour 2 ---: (
git grep -I --files-with-matches --perl-regexp '\r' HEAD
, sur un client compilé en utilisant:--with-libpcre
flag)Et est le piège ici: . En tant que mainteneur de pension, je garde
git.autocrlf=input
afin de pouvoir corriger tous les fichiers mal validés simplement en les ajoutant à nouveau pour la validation. Et je fournis un texte de validation: "Correction des fichiers mal validés".Autant
.gitattributes
qu'on le comprend. Je ne compte pas là-dessus, car il y a plus de clients ui qui ne le comprennent pas. Je ne l'utilise que pour fournir des conseils pour le texte et les fichiers binaires, et peut-être signaler certains fichiers exceptionnels qui devraient partout garder les mêmes fins de ligne:Question: Mais pourquoi sommes-nous intéressés par la stratégie de gestion de la nouvelle ligne?
Réponse: pour éviter une validation de modification d' une seule lettre, apparaissez comme une modification de 5000 lignes , simplement parce que le client qui a effectué la modification a automatiquement converti le fichier complet de crlf en lf (ou l'inverse) avant de l'ajouter pour la validation. Cela peut être assez douloureux en cas de résolution de conflit . Ou cela pourrait dans certains cas être la cause de conflits déraisonnables.
--- MISE À JOUR 2 ---
Les dafaults de git client fonctionneront dans la plupart des cas. Même si vous n'avez que des clients Windows uniquement, des clients Linux uniquement ou les deux. Ceux-ci sont:
core.autocrlf=true
signifie convertir les lignes en CRLF à la caisse et convertir les lignes en LF lors de l'ajout de fichiers.core.autocrlf=input
signifie ne pas convertir les lignes à la caisse (pas besoin car les fichiers devraient être validés avec LF) et convertir les lignes en LF (si nécessaire) lors de l'ajout de fichiers. ( - update3 - : Il semble que ce soitfalse
par défaut, mais encore une fois, ça va)La propriété peut être définie dans différentes étendues. Je suggère de définir explicitement la
--global
portée, pour éviter certains problèmes IDE décrits à la fin.Je déconseille également fortement l' utilisation sur Windows
git config --global core.autocrlf false
(au cas où vous avez uniquement des clients Windows) contrairement à ce qui est proposé pour la documentation Git . La valeur false va valider les fichiers avec CRLF dans le référentiel. Mais il n'y a vraiment aucune raison. Vous ne savez jamais si vous devrez partager le projet avec des utilisateurs Linux. De plus, c'est une étape supplémentaire pour chaque client qui rejoint le projet au lieu d'utiliser les valeurs par défaut.Maintenant, pour certains cas particuliers de fichiers (par exemple
*.bat
*.sh
) dont vous souhaitez qu'ils soient extraits avec LF ou avec CRLF, vous pouvez utiliser.gitattributes
Pour résumer, la meilleure pratique est:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Remarque: sur les clients Windows ne fonctionne que viagit-bash
et sur les clients Linux uniquement s'ils sont compilés à l'aide de--with-libpcre
in./configure
).core.autocrlf=input
( --- mise à jour 3 - ).gitattributes
core.autocrlf
décrit ci-dessus sur ses valeurs par défaut..gitattributes
. Les clients git des IDE peuvent les ignorer ou les traiter différemment.Comme dit, certaines choses peuvent être ajoutées dans les attributs git:
Je pense que d'autres options sûres pour
.gitattributes
au lieu d'utiliser la détection automatique pour les fichiers binaires:-text
(par exemple pour*.zip
ou*.jpg
fichiers: ne sera pas traité comme du texte. Par conséquent, aucune conversion de fin de ligne ne sera tentée. Des différences pourraient être possibles grâce aux programmes de conversion)text !eol
(par exemple*.java
,*.html
:. Donc paramètre client est utilisé traité comme du texte, mais la préférence de style EOL n'est pas réglé.)-text -diff -merge
(par exemple pour*.hugefile
: Non traité comme du texte. Aucune différence / fusion possible)--- MISE À JOUR PRÉCÉDENTE ---
Un exemple douloureux d'un client qui commettra des fichiers à tort:
netbeans 8.2 (sous Windows), commettra à tort tous les fichiers texte avec des CRLF, sauf si vous l'avez explicitement défini
core.autocrlf
comme global . Cela contredit le comportement standard du client git et cause beaucoup de problèmes plus tard lors de la mise à jour / fusion. C'est ce qui rend certains fichiers différents (bien qu'ils ne le soient pas) même lorsque vous revenez .Le même comportement dans les netbeans se produit même si vous avez ajouté correctement
.gitattributes
à votre projet.L'utilisation de la commande suivante après un commit vous aidera au moins à détecter tôt si votre dépôt git a des problèmes de fin de ligne:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
J'ai passé des heures à trouver la meilleure utilisation possible.gitattributes
, pour enfin réaliser que je ne peux pas compter là-dessus.Malheureusement, tant qu'il existe des éditeurs basés sur JGit (qui ne peuvent pas gérer
.gitattributes
correctement), la solution sûre est de forcer LF partout même au niveau de l'éditeur.Utilisez les
anti-CRLF
désinfectants suivants .clients windows / linux:
core.autocrlf=input
engagé
.gitattributes
:* text=auto eol=lf
commis
.editorconfig
( http://editorconfig.org/ ) qui est une sorte de format standardisé, combiné avec des plugins d'éditeur:https://github.com/welovecoding/editorconfig-netbeans/la source
.gitattributes
ligne, elle a des conséquences imprévues dans Git <2.10, voir stackoverflow.com/a/29508751/2261442git config --global core.autocrlf false
et recommandant de traiter le eol dans les.gitattributes
directives uniquement.Ceci est juste une solution de contournement :
Dans des cas normaux, utilisez les solutions fournies avec git. Ceux-ci fonctionnent très bien dans la plupart des cas. Forcer à LF si vous partagez le développement sur les systèmes Windows et Unix en définissant .gitattributes .
Dans mon cas, il y avait> 10 programmeurs développant un projet sous Windows. Ce projet a été enregistré avec CRLF et il n'y avait aucune option pour forcer à LF.
Certains paramètres ont été écrits en interne sur ma machine sans aucune influence sur le format LF; ainsi, certains fichiers ont été globalement modifiés en LF à chaque changement de petit fichier.
Ma solution:
Windows-Machines: laissez tout tel quel. Ne vous souciez de rien, car vous êtes un développeur par défaut de «loup solitaire» et que vous devez gérer comme ceci: «Il n'y a pas d'autre système dans le monde entier, n'est-ce pas?
Unix-Machines
Ajoutez les lignes suivantes à la
[alias]
section d' une configuration . Cette commande répertorie tous les fichiers modifiés (c'est-à-dire modifiés / nouveaux):Convertissez tous ces fichiers modifiés au format DOS:
En option ...
Créez un crochet git pour cette action afin d'automatiser ce processus
Utilisez des paramètres et incluez-le et modifiez la
grep
fonction pour qu'elle ne corresponde qu'à des noms de fichiers particuliers, par exemple:N'hésitez pas à le rendre encore plus pratique en utilisant un raccourci supplémentaire:
... et lancez le contenu converti en tapant
la source