web-dev-qa-db-fra.com

Convertir un dossier git en sous-module rétrospectivement?

Très souvent, il arrive que vous écriviez un projet quelconque, et après un certain temps, il devient clair qu'un composant du projet est réellement utile en tant que composant autonome (une bibliothèque, peut-être). Si vous avez eu cette idée dès le début, il y a de fortes chances que la plupart de ce code se trouve dans son propre dossier.

Existe-t-il un moyen de convertir l'un des sous-répertoires d'un projet git en sous-module? Idéalement, cela se produirait de telle sorte que tout le code de ce répertoire soit supprimé du projet parent et que le projet de sous-module soit ajouté à sa place, avec tout l'historique approprié, et que toutes les validations du projet parent pointent vers les validations de sous-module correctes .

100
naught101

Pour isoler un sous-répertoire dans son propre référentiel, utilisez filter-branch sur un clone du référentiel d'origine:

git clone <your_project> <your_submodule>
cd <your_submodule>
git filter-branch --subdirectory-filter 'path/to/your/submodule' --Prune-empty -- --all

Il ne s'agit alors que de supprimer votre répertoire d'origine et d'ajouter le sous-module à votre projet parent.

77
knittl

Changez d'abord dir en dossier qui sera un sous-module. Ensuite:

git init
git remote add Origin repourl
git add .
git commit -am'first commit in submodule'
git Push -u Origin master
cd ..
rm -rf folder wich will be a submodule
git commit -am'deleting folder'
git submodule add repourl folder wich will be a submodule
git commit -am'adding submodule'
14
zednight

Je sais que c'est un vieux fil, mais les réponses écrasent ici tous les commits associés dans d'autres branches.

Un moyen simple de cloner et de conserver toutes ces branches et validations supplémentaires:

1 - Assurez-vous d'avoir cet alias git

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

2 - Clonez la télécommande, tirez toutes les branches, changez la télécommande, filtrez votre répertoire, appuyez sur

git clone [email protected]:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm Origin
git remote add Origin [email protected]:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git Push --all
git Push --tags
7
oodavid

Cela peut être fait, mais ce n'est pas simple. Si vous recherchez git filter-branch, subdirectory et submodule, il y a quelques bonnes corrections sur le processus. Il s'agit essentiellement de créer deux clones de votre projet, en utilisant git filter-branch pour supprimer tout sauf un sous-répertoire dans l'un et supprimer uniquement ce sous-répertoire dans l'autre. Ensuite, vous pouvez établir le deuxième référentiel en tant que sous-module du premier.

1
twalberg