2011-05-25 5 views
16

J'ai un certain nombre de projets qui sont dans des référentiels Git distincts en ce moment. Ils sont, de même, dans des projets Eclipse séparés (parce que je n'ai pas pu utiliser de projets parents utilisant le plugin Maven depuis longtemps à cause de bugs dans le plugin m2). Maintenant ça marche.Comment faire pour migrer des projets Git pour être un projet avec des sous-projets

J'ai donc combiné les projets dans Maven, en faisant un projet de base pom, en ajoutant cela comme parent aux autres. Ensuite, j'ai imbriqué les sous-projets. Lorsque je suis allé commettre le projet de base en tant que projet git, il a été décidé que les sous-répertoires étaient des sous-modules, même s'il n'y avait pas de fichier .gitmodules dans le répertoire racine.

On dirait que la seule façon d'y parvenir serait de perdre tout l'historique dans les projets qui sont combinés.

Juste pour être super clair, le courant ont:

Project A (repo A) 
Project B (repo B) 
Project C (repo C) 

ce que je veux est:

New Base Project D (repo D) 
    /Project A 
    /Project B 
    /Project C 

Je perdrais plutôt pas l'histoire, mais si je dois, je crois que je pourrais GRENIER les versions antérieures. Je ne pense pas que je veuille des sous-modules, car ceux-ci semblent être orientés vers l'inclusion de repos à distance qui ne sont pas sous votre contrôle.

A fait tourner la solution dans un script bash. Il suppose que les sous-répertoires que vous souhaitez ajouter sont dans des sous-répertoires du même niveau que le parent. Ici, il est:

#! /bin/bash 
git remote add -f $1 ../$1 
git merge -s ours --no-commit $1/master 
git read-tree --prefix=$1 -u $1/master 
git commit -m "Added project $1" 

Git est incroyable ..

Répondre

11

Vous pouvez faire quelque chose appelé « fusion sous-arbre » pour combiner plusieurs référentiels en un seul. Supposons que veulent fusionner ~/projects/alpha et ~/projects/beta dans un nouveau projet, ~/projects/multi:

$ cd ~/projects/multi 
$ git init 

Fusion dans le projet « alpha » projet ...

$ git remote add -f alpha ~/projects/alpha 
$ git merge -s ours --no-commit alpha/master 
$ git read-tree --prefix=alpha -u alpha/master 
$ git commit -m "Added project alpha" 

fusion dans la « bêta » de la même manière.Si la modification est permanente, vous pouvez supprimer la télécommande alpha dans votre nouveau projet. S'il y a encore du développement dans le repo alpha, alors vous pouvez non seulement conserver l'historique, mais aussi apporter de nouveaux changements.

Tout l'historique sera toujours là, et le projet sera dans un sous-répertoire. Je l'utilise sur mon ordinateur personnel pour le "dépôt de projets morts" - un dépôt git massif contenant tout ce que j'ai jamais travaillé sur qui est soit abandonné ou pas assez grand pour son propre dépôt.

+0

Cela ressemble à une grande solution, va essayer ce soir. Merci. – Rob

+0

Nice, je viens de le faire sur les 2 premiers projets. Ça a l'air génial. Merci. – Rob

+0

Bonjour Dietrich? Je suis allé et j'ai fait un git sur l'un des fichiers pour la première fois depuis la migration. N'affiche que mon commit déplaçant le fichier dans le projet, donc il semble que cet historique a disparu. – Rob

0

Ce que je ferais est d'aller pour les sous-modules. Mais si vous voulez vraiment de combiner les prises en pension, procédez comme suit:

  • créer le nouveau référentiel
  • faire une première commettras
  • faire des branches à partir de là à tous les projets que vous souhaitez fusionner
  • pour tous les projets que vous souhaitez fusionner:
    • interrupteur à sa branche temporaire
    • fusionner le référentiel d'origine
    • déplacer à son répertoire de projet (avec git mv)
    • commettras
  • fusion (à maîtriser) et supprimer toutes les branches temporaires du projet
2

Je n'ai pas assez de réputation pour commenter votre historique, je dois donc écrire une réponse.

Utilisation --Suivez avec journal

--follow 
     Continue listing the history of a file beyond renames (works only 
     for a single file). 
+0

Malheureusement, 'git log --follow' ne fonctionne pas dans cette situation. Essayez-le vous-même - il donne une sortie vide. Apparemment, il ne suit pas très bien les commits de fusion. –

+0

Je ne le savais pas, mais au moins je peux commenter maintenant :) – tewe

Questions connexes