2009-07-29 8 views
2

J'essaie de combiner du code sur deux branches avec la commande 'git merge', mais git plante pendant le processus. Je dois trouver une autre façon de fusionner ces branches.git segfaults on merge - conflit sous-module

Pour augmenter la production de fusion à un niveau de débogage j'ai couru:

 
    $ export GIT_MERGE_VERBOSITY=5 

Je suis actuellement sur la branche de destination. git-status montre tout propre et clair. Lorsque je fusionne les branches, c'est ce que je vois (j'ai remplacé les commentaires d'enregistrement par %%%%%% et les noms de fichiers par ####### car ils peuvent être sensibles à l'activité).

$ git merge origin/PH-RELEASE-146.0 
Merging HEAD with origin/PH-RELEASE-146.0 
Merging: 
8399d82 %%%%%% 
4f9dcfe %%%%%% 
found 2 common ancestor(s): 
e0a5fa1 %%%%%% 
ce62bf1 %%%%%% 
    Merging: 
    e0a5fa1 %%%%%% 
    ce62bf1 %%%%%% 
    found 1 common ancestor(s): 
    af34a07 %%%%%% 
    Skipped ######## (merged same as existing) 
    Removed ######## 
    Removed ######## 
    ... 
    Removed ######## 
    Auto-merged build 
    CONFLICT (submodule): Merge conflict in build - needs b3efae4855bc5eb83aa3167ce6c309a4503c3286 
    There are unmerged index entries: 
    1 build 
    2 build 
    3 build 
Merge with strategy recursive failed. 

Il s'avère qu'à ce stade, git-merge s'est bloqué. Comment je le sais? - quand git sous Cygwin:

$ git merge origin/PH-RELEASE-146.0 

    11 [main] git 4352 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack) 

Segmentation fault (core dumped) 
  • lorsque git sous Linux, avec 'ulimit -c unlimited':
 
    $ ulimit -c unlimited; ls -l core; git merge origin/PH-RELEASE-146.0; ls -l core 
    ls: cannot access core: No such file or directory 
    Merging HEAD with origin/PH-RELEASE-146.0 
    ... 
    ... 
    Merge with strategy recursive failed. 
    -rw------- 1 user group 1589248 Jul 29 12:48 core 
  • dans les deux cas, .git/index.lock reste et doit être supprimé manuellement avant que toute commande git ne fonctionne à nouveau:

    $ git status fatale: impossible de créer « .git/index.lock »: Le fichier existe

Je suis entré manuellement à travers la fusion ci-dessus en comparant les ID avec les commettre ceux de l'arbre gitk. Il me semble clair que git cherche des ancêtres communs et brise la fusion en morceaux, traitant chaque ancêtre récursivement. Mais ce que je pense a causé le problème est que le « git-link » à un sous-module appelé « construire » a changé entre commits e0a5fa1 et ce62bf1:

  • dans la construction de sous-module e0a5fa1 est censé être 8dc84b6
  • dans la construction de sous-module ce62bf1 est destiné à être b3efae4

Alors, évidemment, il y a un conflit. Mais c'est un conflit pendant la fusion "partielle" ou peu importe comment il s'appelle, pas le dernier. Et git ne semble pas très bien gérer ça. Ok, donc il y a probablement un bug - comment pourrais-je envoyer un rapport de bogue?

Mais ce qui m'inquiète vraiment ici, c'est le fait que je ne peux pas fusionner ces deux branches. Quelqu'un connaît-il une autre façon de réunir ces branches sans utiliser la commande 'merge'? Puis-je obtenir 'git-merge' pour ignorer complètement ce sous-module pendant tout le processus de fusion?

Linux version 1.6.0.4 git

Cygwin version 1.6.1.2 git

+0

Vous pouvez essayer de supprimer le sous-module de chaque branche avant la fusion, puis ajouter le sous-module après la fusion. –

+0

J'ai essayé mais ça ne marche malheureusement pas, parce que git retourne dans l'historique des commit aux ancêtres secondaires, où le sous-module existe et ne peut pas être supprimé. J'ai résolu cela à la fin en sélectionnant les commits d'une branche à l'autre, mais en omettant délibérément tous les commits qui ont mis à jour le sous-module. – meowsqueak

+0

Heureusement, nos sous-modules sont toujours mis à jour sans aucun autre changement dans le commit! Une fois cela fait, j'ai pu utiliser "git merge -s resolve origin/PH-RELEASE-146.0" pour rapprocher les deux branches (la seule différence dans le commit de fusion était le sous-module manquant) et ensuite ajouter le sous-module retour en arrière. – meowsqueak

Répondre

1

git mise à niveau Essayer sur linux, 1.6.3.3 est la dernière, si cela ne vous aide pas essayer l'idée de William.

+0

Oui, je peux confirmer que 1.6.3.3 ne présente pas ce problème. La fusion identifie correctement un conflit avec le sous-module, mais au lieu de l'interrompre correctement continue la fusion et ajoute d'autres fichiers à l'index. – meowsqueak