2017-09-03 2 views
0

Nous avons peu de projets Maven distincts sous contrôle de version Git. Maintenant, je voudrais combiner ces projets en tant que projet multi-module maven sous POM agrégé, et faire un nouveau référentiel pour ce projet multi-module.Git, comment combiner plusieurs projets en préservant l'historique, sans utiliser de sous-modules

Cependant, je ne veux pas perdre l'historique de ces projets agrégés. J'ai essayé d'initialiser un nouveau référentiel pour le projet agrégé et de cloner les dépôts existants sous l'arborescence de travail. Cependant, ces sous-dépôts sont implicitement considérés comme des sous-modules git, et je ne suis pas fan de l'API git submodule. Je pense que c'est trop obscur pour les autres développeurs, compliquant trop les choses sans réel besoin.

Je voudrais simplement fusionner l'historique de ces dépôts au nouveau référentiel agrégé en quelque sorte. Je ne veux pas synchroniser avec les dépôts d'origine après la fusion de l'historique, mais juste la version contrôle tout sous un nouveau référentiel agrégé sans sous-modules. Néanmoins, j'aimerais extraire un commit spécifique pour n'importe quel référentiel fusionné.

Est-ce possible dans Git?

+0

Avez-vous la réponse qui vous aider à résoudre le problème? Si oui, vous pouvez le marquer comme réponse. Et cela profitera également aux autres qui ont des questions similaires. –

Répondre

1
  1. Initialiser un nouveau dépôt.

  2. Copiez les fichiers des versions souhaitées de tous les projets et combinez-les ensemble. Vous pouvez réorganiser la structure de répertoire si nécessaire. Et assurez-vous que les fichiers ont contenu prévu.

  3. Configuration .gitignore, .gitattribute, etc. Ajoutez-les tous et effectuez le premier commit pour le nouveau dépôt.

  4. Récupère les branches des différents projets et les fusionne toutes avec l'option -s ours. La stratégie ours fusionne les historiques uniquement sans contenu réel.

Exemple:

Disons que nous avons REPOA, RepoB et RepoC, ayant tous une branche master. Nous allons fusionner les fichiers des versions les plus récentes des trois branches.

git init RepoABC 
cd RepoABC 
#copy the files all RepoA, RepoB, RepoC and rearrange the directory structure if necessary. 
#add .gitignore, .gitattribute, etc if necessary. 
git add . 
git commit -m 'new root for combining RepoA RepoB and RepoC' 
git fetch origin_repoa master:repoa_master 
git fetch origin_repob master:repob_master 
git fetch origin_repoc master:repoc_master 
git merge repoa_master repob_master repoc_master -s ours -m 'Merge and preserve the histories of RepoA, RepoB and RepoC, with merge strategy "ours"' 

Maintenant, nous pouvons nous concentrer sur la branche de la nouvelle repo et faire de nouveaux changements. Les histoires sont réservées et nous pouvons les regarder en arrière. Nous pouvons rencontrer un petit problème lorsque nous vérifions un ancien commit pour la première fois, si la structure du répertoire a été réorganisée. Les nouveaux dossiers et fichiers resteront après la validation de la validation, en tant que fichiers non suivis. git clean -df va les ignorer, nous devons donc les rm -rf une fois pour toutes.

1

Oui, c'est possible dans git.

On suppose qu'il ya deux prises en pension/projets doivent combiner, et pour chaque mise en pension, il y a différentes branches:

Repo1: master et dev1

Repo2: master et dev2

Dans une nouvelle Repo, vous pouvez combiner les projets avec les commandes ci-dessous:

git init 
# make changes and commit on master branch if you want to combine the aggregated projects in non-master branch 
git remote add repo1 <URL for repo1> -f 
git remote add repo2 <URL for repo2> -f 
git checkout -b repo1_master repo1/master 
git checkout -b repo1_dev1 repo1/dev1 
git checkout -b repo2_master repo2/master 
git checkout -b repo2_dev2 repo2/dev2 

Maintenant, toutes les branches dans repo1 et repo2 sont agrégées dans le nouveau repo créé dans les branches: repo1_master, repo1_dev1, repo2_master et repo2_dev2. Et si vous n'avez pas besoin de faire/obtenir des changements de repo1 et repo2 plus, vous pouvez supprimer les télécommandes:

git remote rm repo1 
git remote rm repo2