Est-il possible git merge
d'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 sont devenues un peu désordonnées et incontrôlables , surtout quand je l'ai appliqué après coup .
D'une part, appliquer cette configuration après coup 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 entraînent maintenant de nombreux messages d'avertissement ennuyeux concernant la conversion de CRLF en LF.
Pour être honnête, je ne me soucie pas vraiment de 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 git merge
d'être un peu plus intelligent et d'ignorer les différences de fin de ligne.
Parfois, j'ai deux fichiers identiques, mais git les marquerait 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.
Mettre à jour:
J'ai découvert que cela git diff
accepte une --ignore-space-at-eol
option, serait-il possible de laisser git merge
utiliser cette option également?
git config merge.renormalize true
Réponses:
Mise à jour 2013:
Les versions plus récentes de git autorisent l'utilisation de la fusion avec l' option de stratégie
recursive
et de stratégie ( ):-X
Mais utiliser "
-Xignore-space-change
" est aussi une possibilitéjakub.g commente également que les stratégies fonctionnent également avec le tri sélectif :
Cela fonctionne bien mieux que
ignore-all-space
.Réponse originale (mai 2009)
Le patch pour ignorer le style eol a été proposé en juin 2007 , mais cela ne concerne que
git diff --ignore-space-at-eol
, nongit merge
.À l'époque, la question a été posée:
Julio C Hamano n'était pas vraiment enthousiaste:
L'idée générale, quand il s'agit
git merge
, est de s'appuyer sur l'outil de fusion tiers.Par exemple, j'ai configuré DiffMerge pour être l'outil de fusion Git, en définissant un ensemble de règles qui permet à cet outil de fusion d'ignorer eol pour certains types de fichiers.
Installation sous Windows, avec MSysGit1.6.3, pour une session DOS ou Git bash, avec DiffMerge ou KDiff3:
c:\HOMEWARE\cmd
.merge.sh:
Commandes Git config:
git config au niveau du système:
Script DOS (note: la commande dos2unix vient d'ici , et est utilisée pour simuler un style Unix eol. Cette commande a été copiée dans le répertoire mentionné au début de cette réponse.):
C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):
À ce stade (en cliquant sur «retour»), DiffMerge ou KDiff3 s'ouvrira, et vous verrez par vous-même quelles lignes sont réellement fusionnées et quelles lignes sont ignorées.
Attention : le fichier résultat sera toujours en mode Windows eol (CRLF) avec DiffMerge ...
KDiff3 propose de sauvegarder d'une manière ou d'une autre.
la source
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
(cela fonctionne beaucoup mieux queignore-all-space
)Je cherchais la même réponse et j'ai découvert cette
Donc, exécuter cette commande dans n'importe quel référentiel fera l'affaire:
la source
Après avoir lu https://stackoverflow.com/a/12194759/1441706 et https://stackoverflow.com/a/14195253/1441706
pour moi, cette commande a parfaitement fonctionné:
la source
Comme dans cette réponse: https://stackoverflow.com/a/5262473/943928
Tu pourrais essayer:
git merge -s recursive -Xignore-space-at-eol
la source
Ce que j'ai fait a été de tout laisser par défaut (c'est-à-dire autocrlf = true), de toucher tous les fichiers (find. -Exec touch {} \;), de laisser git les voir comme "modifiés" et de les valider, et en finir. Sinon, vous serez toujours soit en proie à des messages ennuyeux ou des différences surprenantes, soit vous devrez désactiver toutes les fonctionnalités d'espace blanc de git.
Vous perdrez les informations de blâme, mais il vaut mieux le faire le plus tôt possible :)
la source
"git merge -Xrenormalize" fonctionne comme un charme.
la source
Il ne semble pas que cela puisse être fait directement, mais cet article suggère une solution.
http://osdir.com/ml/git/2009-02/msg02532.html
la source
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 par lui-même un LF et le fichier semble changé dans git. A part ça, ça marche.
la source
Il me semble maintenant que le meilleur moyen est de normaliser les fins de ligne sur les deux branches (et de commettre) avant de les fusionner.
J'ai recherché sur Google "convertir crlf en lf" et j'ai trouvé ceci dans les premiers résultats:
http://stahlforce.com/dev/index.php?tool=remcrlf
Je l'ai téléchargé et utilisé, cela semble être un bon outil.
Assurez-vous cependant de spécifier un répertoire et un type de fichier (par exemple .py) sinon il pourrait essayer de jouer avec le contenu du
.git
répertoire!la source
AFAICT, (je ne l'ai pas essayé), vous pouvez utiliser
git diff
pour comparer la branche que vous souhaitez fusionner avec l'ancêtre commun, puis appliquer les résultats avecgit apply
. Les deux commandes ont des--ignore-whitespace
options pour ignorer les erreurs de fin de ligne et d'espace blanc.Malheureusement, si le patch ne s'applique pas correctement, toute l'opération est abandonnée. Vous ne pouvez pas résoudre les conflits de fusion. Il existe une
--reject
option pour laisser des morceaux non patchables dans les.rej
fichiers, ce qui aide, mais ce n'est pas la même chose que d'afficher les conflits de fusion dans un fichier.la source
Après avoir lu Résoudre les conflits de fusion: Forcer l'écrasement de tous les fichiers
J'ai finalement résolu ma version de ce problème. J'essayais d'extraire les mises à jour du dépôt en amont, mais mon actuel avait des problèmes liés à CRLF et je n'ai pas pu fusionner en conséquence. Il convient de noter que je n'avais AUCUN CHANGEMENT LOCAL dont je devais m'inquiéter. Les étapes suivantes ont résolu mon problème:
Selon les instructions de github sur la synchronisation des fourches ( https://help.github.com/articles/syncing-a-fork/ ):
git fetch upstream
git reset --hard upstream/master
Ma compréhension limitée de git me dit que cela fait ce que je veux - rebaser mon fork (sans modifications réelles non validées) pour obtenir toutes les modifications apportées à la source en amont. Selon la page source, cette étape ne devrait normalement pas être requise, mais le problème CRLF l'a rendue obligatoire.
git merge upstream/master
git push
la source
git reset --hard upstream/master
jette votre succursale locale et la pointe versupstream/master
, faisantgit merge upstream/master
un no-op?Cependant, je suggère d'utiliser un outil comme sed pour obtenir des fins de ligne correctes, puis des fichiers diff. J'ai passé quelques heures sur différents projets avec différentes fins de ligne.
Le meilleur moyen était de:
.git
répertoire) dans un autre répertoire, créer un référentiel dedans, puis ajouter des fichiers et les valider (devrait être sur la branche maître dans le nouveau référentiel).dev
(git checkout -b dev
), valider les fichiers sur cette branche et exécuter (si le premier projet est en master):git diff master..dev --names-only
pour voir uniquement les noms des fichiers modifiésla source