Comment migrer les projets Git pour ne faire Qu'un seul projet avec des sous-projets

j'ai un certain nombre de projets qui sont situés dans des dépôts Git maintenant. Ils sont, de même, dans des projets eclipse séparés (parce que j'ai été incapable d'utiliser des projets parents en utilisant le plugin Maven pendant une longue période en raison de bugs dans le plugin m2). Maintenant que les œuvres.

donc j'ai combiné les projets dans Maven, faisant un projet de base pom, ajoutant que comme le parent aux autres. Puis j'ai imbriqué les sous-projets.

quand je suis allé engager le projet de base comme un projet git, il avait décidé que les sous-répertoires étaient des sous-modules, même s'il n'y en avait pas .gitmodules fichier dans le répertoire racine.

Regarde comme la seule façon de le faire serait de perdre toute l'histoire dans les projets qui leur sont associés.

Juste pour être super clair, actuel ont:

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

est ce que je veux:

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

je préférerais ne pas perdre d'histoire mais si je le dois, je suppose que je pourrais attiser les versions précédentes. Je ne pense pas que je veux sous-modules, car ceux-ci semblent être conçus pour inclure des repos à distance qui ne sont pas sous votre contrôle.

a transformé la solution en script bash. Il suppose que les sous que vous voulez ajouter sont dans des sous-répertoires au même niveau avec le parent. Ici, c'est:

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

Git est incroyable..

16
demandé sur Rob 2011-05-25 04:18:31

3 réponses

vous pouvez faire quelque chose appelé "subtree merge" pour combiner plusieurs dépôts en un seul. Supposons que vous voulez fusionner!--2--> et ~/projects/beta dans un nouveau projet, ~/projects/multi:

$ cd ~/projects/multi
$ git init

fusionner dans le projet" alpha"...

$ 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"

fusionner dans le projet" beta " de la même façon. Si le changement est permanent, alors vous pouvez supprimer la télécommande alpha dans votre nouveau projet. S'il y a encore du développement dans l'Alpha repo, alors vous pouvez non seulement garder l'histoire, mais tirer dans le nouveau trop de changements.

Toute l'histoire 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 énorme dépôt git contenant tout ce sur quoi j'ai travaillé qui est soit abandonné ou pas assez grand pour son propre dépôt.

11
répondu Dietrich Epp 2011-05-25 01:06:26

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

Utiliser: suivez avec le journal

--follow
       Continue listing the history of a file beyond renames (works only
       for a single file).
2
répondu tewe 2011-05-27 07:29:39

ce que je ferais est d'aller pour des sous-modules. Mais si vous voulez vraiment combiner les repos, faites ce qui suit:

  • créer le nouveau référentiel
  • faire un premier commit
  • faire des branches à partir de là à chaque projet ce que vous voulez fusionner
  • pour chaque projet que vous souhaitez fusionner:
    • passer à sa branche temporaire
    • fusionner le dépôt original
    • le déplacer dans son répertoire de projets (avec git mv)
    • valider
  • fusionner (pour maîtriser) et supprimer toutes les branches temporaires du projet
0
répondu tamasd 2011-05-25 00:36:17