2016-07-13 1 views
2

J'ai un référentiel git qui contient plusieurs sous-répertoires. Je veux maintenant diviser plusieurs sous-répertoires dans un nouveau référentiel. Il semble que git subtree rende cela facile si vous avez seulement un sous-répertoire que vous voulez extraire dans un nouveau dépôt, mais qu'en est-il de l'extraction de plusieurs sous-répertoires? Je ne vois pas une façon propre de le faire.Détacher (déplacer) plusieurs sous-répertoires dans un référentiel Git distinct

C'est la structure que j'ai maintenant (avec le dépôt en AlphaDirectory):

AlphaDirectory 
    AlphaSubDirectory1 
    AlphaSubDirectory2 
    BetaSubDirectory1 
    BetaSubDirectory2 

C'est ce que j'ai besoin (avec un dépôt séparé dans chacune des AlphaDirectory et BetaDirectory):

AlphaDirectory 
    AlphaSubDirectory1 
    AlphaSubDirectory2 
BetaDirectory 
    BetaSubDirectory1 
    BetaSubDirectory2 

Ceci est lié à Splitting many subdirectories into a new, separate Git repository et ses questions référencées mais pas même que la structure dans les 3 questions posées diffèrent.

+2

Avez-vous besoin de l'historique du matériel dans les sous-répertoires bêta? Avez-vous envisagé de cloner (forking) le référentiel, puis de supprimer les éléments indésirables de chaque référentiel séparé? Il y a probablement de meilleurs moyens pour y faire face, mais la force brute a parfois ses mérites. –

Répondre

2

Ce type de séparation doit être fait avec git filter-branch:

git clone AlphaDirectory BetaDirectory 

cd AlphaDirectory 
git filter-branch --tree-filter "rm -rf BetaSubDirectory*" --prune-empty -- --all 

cd ../BetaDirectory 
git filter-branch --tree-filter "rm -rf AlphaSubDirectory*" --prune-empty -- --all 
0

Je suppose que dans le nouveau référentiel, vous ne souhaitez que de préserver l'histoire liée aux répertoires qui sont déplacés au lieu de l'histoire complète de la référentiel d'origine. J'ai eu le même problème et c'est ce qui a fonctionné pour moi. Commencez par séparer l'historique des deux projets en deux nouvelles branches (ou plus de deux si vous le souhaitez) dans le référentiel d'origine. Vous pouvez le faire sur un clone d'AlphaDirectory afin de ne pas polluer votre référentiel d'origine.

cd AlphaDirectory 
git subtree split -P BetaSubDirectory1 -b BetaSubDirectory1Branch 
git subtree split -P BetaSubDirectory2 -b BetaSubDirectory2Branch 
cd .. 

Ensuite, créer un nouveau référentiel et ajouter ancien référentiel à distance (comme les dépôts git peuvent avoir plusieurs télécommandes et c'est OK!).

cd BetaDirectory 
git init 
git remote add alpharepo ../AlphaDirectory 
git fetch alpharepo 

Et puis pour chaque branche, vous fusionnez essentiellement chaque branche, mais il sera fusionné à l'extérieur du sous-répertoire d'origine. Vous pouvez corriger cela en créant un sous-répertoire tel qu'il était dans le repo original, et en remettant tous ses fichiers à l'intérieur, puis en le validant. Bien sûr, lorsque vous déplacez des éléments, vous ne voulez pas déplacer les répertoires .git et BetaSubDirectory?.

git merge alpharepo/BetaSubDirectory1Branch 
mkdir BetaSubDirectory1 
<move stuff from BetaDirectory into BetaSubDirectory1> 
git commit -m "merge BetaSubDirectory1" 

git merge alpharepo/BetaSubDirectory2Branch 
mkdir BetaSubDirectory2 
<move stuff from BetaDirectory into BetaSubDirectory2> 
git commit -m "merge BetaSubDirectory2" 

Et enfin, enlever la vieille distance:

git remote remove alpharepo 

Cela fonctionne aussi pour plus de deux sous-répertoires (j'avais 15).