2009-08-20 3 views
17

Nous avons déjà utilisé de nombreux sous-modules dans nos dépôts principaux, mais pour augmenter la maintenabilité de nos projets, nous avons démarré une branche expérimentale où nous les avons tous remplacés par des sous-arbres.Git confus lors de la fusion d'une mise à jour dans mon sous-arbre

Cela a fonctionné bien - mais maintenant quand j'essaye de mettre à jour l'un des sous-arbres, il fusionne la mise à jour par erreur dans un répertoire complètement faux qui n'est même pas un sous-arbre.

Le dépôt principal, où la branche « sous-arbre » contient la branche expérimentale, est: git: //github.com/hugowetterberg/goodold_drupal.git

Le dépôt de fusion dans les mises à jour: git : //github.com/voxpelli/drupal-oembed.git

fusion en faisant: -s sous-arbre git merge oEmbed/maître

Le chemin des mises à jour doivent être fusionnées en: sites/all/modules/oEmbed/

Le chemin ils sont fusionnés en: modules/agrégateurs/traductions/

Toute personne ayant une idée de la façon d'obtenir les mises à jour dans les sous-arbres ou ce que l'erreur peut être?

Répondre

18

Malheureusement, il s'agit d'un bug (ou d'une fonctionnalité manquante) dans le code "git merge -s subtree". En fait, il devine les sous-arbres que vous souhaitez fusionner. Habituellement, cela se révèle comme par magie, mais si votre sous-arbre contient beaucoup de changements (ou était à l'origine vide, ou peu importe), alors il peut échouer spectaculairement.

La meilleure façon de contourner le problème est:

  1. Fusionner les fichiers que vous avez fait ci-dessus.

  2. Déplacez manuellement tous les fichiers résultants là où aurait disparu.

  3. git commit -a --amend pour corriger la validation de fusion.

Les fusions futures fonctionneront probablement bien, à moins que ce répertoire ne soit constamment en quantité incroyable de flux.

La commande expérimentale « git subtree » a un paramètre --prefix qui devrait vous laisser passer outre, mais malheureusement, il ne fonctionne pas au moment (car il faut travailler autour des fonctions « sous-arborescence de fusion git » et il n'y a pas été le temps de le faire). De toute façon, cela devrait être une situation rare et la solution de contournement ne sera pas nécessaire, même pour les futures fusions du même projet.

+7

Je viens PRÉSENTÉS un patch à git qui vous permettra de remplacer le sous arborescence explicitement en utilisant cette option '-Xsubtree =', et il a été accepté. Recherchez-le dans git 1.7.0 ou plus. – apenwarr

+2

Lorsque vous apportez un seul dossier du repo source (par exemple, 'git read-tree --prefix = dest/-u source_repo/master: dossier_in_repo /') plutôt que le tout, la fusion des modifications même mineures vers le repo semble pour que le dossier entier soit placé dans un nouvel emplacement dans le repo (c'est-à-dire dupliqué). –

+0

La situation n'est pas si rare, en fait :-( –

Questions connexes