12
votes

"git fusion - les leurs" nécessaires - mais je sais que cela n'existe pas

J'ai un certain nombre de référentiels distants que je veux fusionner ensemble. Certains des sous-arbres de ces référentiels sont uniques à la télécommande (elles contiennent des données spécifiques à l'hôte), d'autres sous-arbres contiennent des données (supposées) communes dans toutes les télécommandes.

Ce que je veux faire, essentiellement, est exécuté "git tirant" pour chaque télécommande. Cela facilitera la branche principale locale le long de la branche de suivi du maître distant pour les fichiers spécifiques à l'hôte qui ont changé sur la télécommande et ne feront rien pour les fichiers communs car ils n'auront pas changé.

Un changement dans un fichier commun (appelez-le F, avec le changement étant F ') ne devrait pas être un problème, même s'il n'arrive que sur une télécommande au début. Git-fusion fera la bonne chose et me donnera une copie de F 'dans mon espace de travail composite, ce que je veux. Le problème vient si le même fichier commun change d'une manière différente sur une autre télécommande (appelez-la F »). Git-fusion me donnera un composé de F 'et F», ce que je ne veux pas. Tout ce que je veux, c'est F ".

Quand j'ai travaillé avec ClearCase, nous avons appelé cela une fusion de copie. Le résultat de la fusion a toujours été une copie exacte du contributeur. Cela semble beaucoup comme "git fusion -s -s leur" serait, sauf que cela n'existe pas.

Je me demande si je peux cuisiner quelque chose avec "Git-Read-Tree -M -M --Trivial" pour obtenir les fonts rapides à l'écart, alors faites de la magie avec git-fusion et un mergetool personnalisé que tout simplement Copie le fichier $ distant à $ fusionné. Mais même avec ce que je ne vois pas comment je peux arrêter de git-fusionner de la composition de F 'et de F "si la fusion est triviale.

J'ai lu le lien y a-t-il une version "leur" de " git fusion -s -sos "? sur ce site, et le message de Junio ​​Hamano informatique informatique expliquant pourquoi" git fusion-location "est une si mauvaise idée, mais ce n'est pas le cas pour moi. J'apprécie la vieille histoire, mais je dois sauter du navire et suivre le changement sur le site distant quand on se produit. Aucun nouveau travail n'est fait sur le site local. Il a simplement besoin de former un composite de tous les sites distants, de prendre le dernier fichier "commun" de la dernière télécommande interrogée lorsqu'une modification.

Merci d'avance pour toute aide que vous pouvez me donner.


5 commentaires

À partir de la page Gitattributes Man: Lorsque vous décidez des attributs attribués à un chemin, git consults $ git_dir / info / attributs (qui a la priorité la plus élevée), fichier .gitattributes dans le même répertoire que le chemin en question et ses répertoires parent Jusqu'à la tête de toplevel de l'arborescence de travail (le nouveau répertoire contenant .gitattributes provient du chemin en question, la priorité inférieure) ... Alors mettez votre .gitattribute au sommet de l'arbre concerné. Le pilote de fusion personnalisé ne s'appliquera que pour cet arbre.


Echo * Fusion = Keartheir> Dirwithcopymérge \ .gitattributes devrait le faire pour tous les fichiers sous dirwithcopymérge , pas pour tous les fichiers pour tous les repo. Cela devrait être ce que vous recherchez.


Je viens de terminer ma réponse pour refléter mes commentaires précédents.


Est-ce que "*" globe de la même manière que dans Bash? Si c'est le cas, cela manquera les fichiers DOT. Je suppose que votre ligne de commande est pour Windoze (MSYSGIT?) Comme vous avez une barre oblique inverse pour un séparateur de répertoire (qui m'avait confondu pour un moment!) Je suppose que définir une copie générale-fusionner avec "git config merge.default .Driver "pourrait avoir des conséquences imprévues, car je pourrais éventuellement avoir besoin d'une fusion normale dans d'autres parties du représentant, une approche plus concentrée utilisant un fichier de placement bien placé pourrait être moins surprenant. Merci pour les informations sur les attributs du fichier précédent - très utile.


Voir la réponse Commande GIT pour faire une branche Comme un autre pour Tous les moyens possibles actuels de simuler git fusion-y leur .


5 Réponses :


2
votes

(Mise à jour 2011:
La réponse " Commande GIT pour faire une branche Comme un autre "list tous les les moyens possibles de simulez une fusion de git -s de la part de leur" )


pour les fichiers spécifiques / Les arbres que vous souhaitez copier-fusionner, vous pouvez configurer une Valeur gitattributes < / Strong> Comme celui que je mentionne dans ce Alors, question , définissant un pilote de fusion personnalisé.
Le script associé à l'attribut de fusion garantirait toujours la maintenance du fichier distant comme le résultat de la fusion (voir ceci Répondez-la pour une illustration, bien que pour le scénario opposé - Garder la version locale). xxx

En définissant un .gitattribute sur le dessus du sous-arbre, vous souhaitez être fusionné, avec ' * fusionné = retenir ' comme Son contenu, vous attribuez efficacement un pilote de fusion personnalisé à tous les fichiers de ce sous-arbre (notez l'utilisation de la carte générique ' * ' '

avec retenir.sh comme: < / p> xxx

Vous ne devez pas modifier aucun pilote de fusionnage "par défaut" et que vous appliquez le vôtre uniquement sur les fichiers que vous souhaitez.


3 commentaires

La solution fonctionnera mais, puisque je veux que cela se produise pour chaque fichier, le faire avec des attributs est un peu inébranlable. Toutefois, la section Gitattributes (5) de la meuble sur "Fusionne" mentionne la variable de configuration "fusion.default". Cela définit le pilote de fusion à appeler à des fichiers où l'attribut Merge n'est pas spécifié, ce qui sera mon référentiel complet si je ne le précise pas! Il semble donc que je puisse faire "git config merge.default.diver 'mv -f% b% a && sortie 0'" et ne vous inquiétez pas des attributs de réglage. Est-ce que cela a du sens pour vous? J'ai utilisé MV plutôt que cp parce que c'est plus rapide.


@kbro: "Depuis que je veux que cela se produise pour chaque fichier, le faire avec des attributs est un peu inébranlable". Je dirais: assez "Gainly" en fait; un '*' serait suffisant. Voir ma réponse complétée.


Est-ce que le Globe Wildcard '' entièrement sur des systèmes U IX ou doit-il y avoir un attribut supplémentaire pour ". *" En supposant que je souhaite copier-fusionner ces fichiers aussi? Ou existe-t-il un moyen de glober des fichiers DOT et des fichiers non-points? Triste que je ne sais pas!



8
votes

Un grand merci à @ VonC pour suggérer l'utilisation du = fusion-pilote personnalisé strong> attribut dans le fichier .gitattributes em> strong>. Bien que cela fonctionne, je suis réticent à souiller mon espace de travail avec des fichiers .git, et alors que je pouvais utiliser $ GIT_DIR / info / attributs em> strong> pour éviter la pollution, I » m dérangé par le besoin de 2 règles aux fichiers de points captures accessoires et les fichiers non-points.

Après un peu d'expérimentation, je réussi à obtenir une solution avec la configuration merge.default strong> variable (mentionné dans gitattributes (5) em> manpage) travail. L'astuce est que j'ai raté merge.default strong> prend nom em> d'un pilote personnalisé que vous avez défini précédemment; vous ne donnez pas la commande personnalisée em> directement. Voici ce qui fonctionne pour moi ... p>

Tout d'abord définir votre pilote personnalisé copie fusion. Vous pouvez utiliser les commandes shell directement; il n'y a pas besoin d'un script externe (assurez-vous que vous obtenez votre cité méta caractères shell à droite): p>

cd path/to/copy-merge/in/path/to/normal-merge/in
echo '* merge'  >  .gitattributes
echo '.* merge' >> .gitattributes


4 commentaires

Vous avez tellement de sous-arbres que vous ne voulez pas les fichiers .gitattributes? Et je ne comprends pas que le "est tenu de conduire à la confusion, surtout si vous utilisez également des choses comme" * .bin -fr.bin -Ferge ". Quoi qu'il en soit, commentaires intéressants. +1


Pour mes fins, je n'ai qu'un seul sous-arbre - l'ensemble de la répétition! Mais je suis contre des fichiers .gitattributes sur principe lorsqu'ils polluent l'espace de travail - j'ai travaillé avec des CV et Subversion depuis trop longtemps pour vouloir mettre à l'outil spécifique à Cr * P dans mes fichiers :-)


La confusion que je parle pourrait survenir si vous avez déjà utilisé .gitattributes pour configurer des actions de fusion personnalisées pour d'autres fichiers de filetypes, puis vous souhaitez définir des choses pour une fusion de copie. Compte tenu des règles de préséance pour les fichiers .gitattributes, la mise dans votre répertoire de niveau supérieur ne remplace pas le paramètre dans des fichiers de niveau inférieur à niveau inférieur. Vous obtiendrez donc une copie-fusionner pour des fichiers fusionnés par défaut, mais vous obtiendrez l'action de remplacement précédente pour ceux que vous avez déjà définis. Certainement déroutant.


Le seul moyen, si vous voulez copier-fusionner dans tout le référentiel (que je fais) est de définir l'attribut Merge en $ git_dir / info / attributs, car cela annule tout . Notez que la définition de la variable de configuration Merge.Default ne garantit pas une fusion de copie complète, car cela n'atteignit que des fichiers pour lesquels l'attribut Merge est non spécifié . Donc, @voncc était juste après tout - utilisez des attributs. Mais j'étais quelque chose aussi, disant .gitattributes n'était pas le meilleur endroit pour le faire :-)



3
votes

Dans la version 1.7.1 de GIT, vous pouvez transmettre une stratégie "leur" pour fusionner et "-xTheirs" argument.

git fusion -XTheirs AutresBranch (code>

Je ne sais pas si cela s'applique à ce que vous essayez de faire, mais cela vaut probablement une chance.

(Voir aussi cette question connexe )


2 commentaires

Je pense que cela devrait être git fusion -s -s récursive -x leur autre branche


- Stratégie et - Option de stratégie sont des choses très différentes. Avoir à bownvote: /



3
votes

a couru dans ce problème l'autre jour:

http: //seanius.net/blog/2011/02/git-merge-s-theirs/ P>

git merge -s ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply -R --index
git commit -F .git/COMMIT_EDITMSG --amend


1 commentaires

Je viens d'essayer cela, ça marche assez bien sauf que vous ne pouvez pas limiter la fusion à des chemins spécifiques. mais autre que ça c'est génial



0
votes

Après une tonne de recherches, passez à travers tout le bruit et en apprenant davantage sur git code> ( finit-il jamais? em>), je crois que cette réponse est la La plupart des moyens sans bruit et optimaux d'obtenir une stratégie - Stratégie Code> Simulation Fusionner le pilote. Utilisable à la demande, aucun gitattributes code> déchets nécessaire.

Je suis toujours un peu étourdi de savoir s'il s'agit d'un - Stratégie leur code> SIMULATION, ou l'utilisable la plus lisse Checkout --Theirs. code> Méthode de résolution de conflit. Peut-être qu'ils sont des équivalents, mais je devrais diagnostiquer quelques graphiques de résultats pour bien comprendre, ce qu'il n'y a pas de temps pour le moment. P>

accessoires à @kbro faisant la bonne chose à faire de la bonne chose, et Obtenir assez proche dans https://stackoverflow.com/a/1911370/35946 p>

[Git: maître] code> est l'affichage de l'invite de shell. p>

Configuration strong> p> xxx pré>

p> xxx pré>

bonus: alias strong> p> xxx pré>

Utilisation: alias P>

$ [git:master] git merge-theirs develop


0 commentaires