web-dev-qa-db-fra.com

Est-il possible pour git-merge d'ignorer les différences de fin de ligne?

Est-il possible pour git merge ignorer les différences de fin de ligne?

Peut-être que je pose la mauvaise question ... mais:

J'ai essayé uisng config.crlf input mais les choses se sont un peu désordonnées et hors de contrôle, spécialement quand je l’ai appliquée après coup.

D'une part, appliquer cette configuration après le fait ne semble pas affecter les fichiers qui ont été validés dans le référentiel avant d'appliquer cette option. Une autre chose est que, soudainement, tous les commits génèrent de nombreux messages d’avertissement gênants sur la conversion de CRLF en LF.

Pour être honnête, peu importe la fin de ligne utilisée, je préfère personnellement le style Unix \n, mais peu importe. Tout ce qui m'importe, c'est pour git merge être un peu plus intelligent et ignorer les différences entre les fins de ligne.

Parfois, j'ai deux fichiers identiques, mais git les marque comme étant en conflit (et le conflit est le fichier entier) simplement parce qu'ils utilisent un caractère de fin de ligne différent.

Mise à jour:

J'ai découvert que git diff accepte un --ignore-space-at-eol option, serait-il possible de laisser git merge utilisez-vous cette option également?

143
hasen

Je cherchais la même réponse et j'ai découvert this

Fusion de branches avec des attributs d’archivage/de sortie différents

Si vous avez ajouté des attributs à un fichier qui entraînent la modification du format de référentiel canonique de ce fichier, tels que l'ajout d'un filtre pur/smudge ou d'attributs text/eol/ident, la fusion de tout élément où l'attribut n'est pas en place entraînerait normalement des conflits de fusion. .

Pour éviter ces conflits de fusion inutiles, il est possible d'indiquer à git d'exécuter une extraction et une archivage virtuelles des trois étapes d'un fichier lors de la résolution d'une fusion à trois voies en définissant la variable de configuration merge.renormalize. Cela évite que les modifications provoquées par la conversion d'archivage ne provoquent de faux conflits de fusion lorsqu'un fichier converti est fusionné avec un fichier non converti.

Tant qu'un "smudge → clean" produit le même résultat qu'un "clean", même sur les fichiers déjà maculés, cette stratégie résoudra automatiquement tous les conflits liés au filtre. Les filtres qui n'agissent pas de cette manière peuvent entraîner des conflits de fusion supplémentaires qui doivent être résolus manuellement.

Donc exécuter cette commande dans n'importe quel référentiel fera l'affaire:

git config merge.renormalize true
90
Fabio

Après avoir lu https://stackoverflow.com/a/12194759/1441706 et https://stackoverflow.com/a/14195253/1441706

pour moi, cette commande a parfaitement fait l'affaire:

git merge master -s recursive -X renormalize
22
Fab V.

Comme dans cette réponse: https://stackoverflow.com/a/5262473/943928

Tu pourrais essayer: git merge -s recursive -Xignore-space-at-eol

"git merge -Xrenormalize" fonctionne à merveille.

4
Jake

Ce que j’ai fait, c’est de tout laisser comme valeur par défaut (c’est-à-dire autocrlf = true), de toucher tous les fichiers (find. -Exec touch {} \;), de permettre à git de les voir comme 'modifiés' et de les renvoyer, puis le faire. Sinon, vous serez toujours en proie à des messages ennuyeux ou à des différences surprenantes, ou vous devrez désactiver toutes les fonctionnalités d'espaces blancs de git.

Vous perdrez des informations sur le blâme, mais il vaut mieux le faire plus tôt que tard :)

4
Ben Hymers

http://stahlforce.com/dev/index.php?tool=remcrlf

Je l'ai essayé, mais si après la dernière ligne de votre code vous n'aviez pas déjà CRLF, il ajoute lui-même un LF et le fichier a été modifié dans git. En dehors de cela, cela fonctionne.

1
antman

Il ne semble pas que cela puisse être fait directement, mais cet article suggère un travail de contournement.

http://osdir.com/ml/git/2009-02/msg02532.html

1
Dean Smith

AFAICT, (je ne l'ai pas essayé) tu pourrais utiliser git diff pour comparer la branche que vous souhaitez fusionner avec l'ancêtre commun, puis appliquez les résultats avec git apply. Les deux commandes ont --ignore-whitespace options pour ignorer les erreurs de fin de ligne et d’espace.

Malheureusement, si le correctif ne s’applique pas correctement, l’opération est annulée. Vous ne pouvez pas résoudre les conflits de fusion. Il y a un --reject option pour laisser des mecs impossibles à synchroniser dans .rej fichiers, ce qui aide, mais ce n’est pas la même chose que d’avoir les conflits de fusion affichés dans un fichier.

0
rjmunro

Il me semble maintenant que le meilleur moyen est de normaliser les fins de ligne sur les deux branches (et de valider) avant de les fusionner.

J'ai googlé "convertir crlf en lf" et trouvé ceci comme les premiers résultats:
http://stahlforce.com/dev/index.php?tool=remcrlf

Je l'ai téléchargé et utilisé, semble être un outil de Nice.

>sfk remcr . .py

Assurez-vous cependant de spécifier un répertoire et un type de fichier (par exemple, .py), sinon, vous pourriez essayer de modifier le contenu du fichier .git répertoire!

0
hasen