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.
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ètrecore.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? :- /
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.
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 oucore.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 pourcore.autocrlf=false
était que automatique heuristique peut mal détecter certains binaires en tant que texte et alors votre tuile sera corrompue. Si, L'optioncore.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.
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.
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.
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.
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 ligneLF
. Pas de risque pour le reste de l'équipe, car vos commits seront toujours normalisés avec les fins de ligneLF
. - si vous êtes un utilisateur de Windows avec
core.autocrlf = false
, vous verrez un tas de fichiers avec des fins de ligneLF
et vous pouvez introduire des fichiers avec des fins de ligneCRLF
dans la pension. - la plupart des utilisateurs Mac utilisent
autocrlf = input
et peuvent obtenir des fichiers avecCRLF
fin de fichier, probablement des utilisateurs de Windows aveccore.autocrlf = false
.
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
-
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 "
-
Convertir tous les changé fichiers en format dos:
unix2dos $(git lc)
-
facultatif ...
-
Créer un git crochet pour cette action d'automatiser ce processus de
-
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)" | ...
-
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
-
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
.
-
clients windows/linux:
core.autocrlf=input
-
commis
.gitattributes
:* text=auto eol=lf
-
committed
.editorconfig
( http://editorconfig.org / ) qui est une sorte de format standardisé, combiné avec des plugins d'édition:
--- 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.