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

Assez souvent, vous écrivez un projet et après un certain temps, il devient clair que certains composants du projet sont réellement utiles 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.

Est-il possible de convertir l’un des sous-répertoires d’un projet git en un 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 tout le projet parent valide le commit du sous-module correct. .

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   cd  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’append le sous-module à votre projet parent.

Tout d’abord, changez le répertoire en dossier qui sera un sous-module. Alors:

 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' 

Je sais que c’est un vieux sujet, mais les réponses ici écrasent tous les commits connexes dans d’autres twigs.

Un moyen simple de cloner et de conserver toutes ces twigs et commits supplémentaires:

1 – Assurez-vous d’avoir cet alias git

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

2 – Cloner la télécommande, tirer toutes les twigs, changer la télécommande, filtrer votre répertoire, pousser

 git clone git@github.com:user/existing-repo.git new-repo cd new-repo git clone-twigs git remote rm origin git remote add origin git@github.com:user/new-repo.git git remote -v git filter-branch --subdirectory-filter my_directory/ -- --all git push --all git push --tags 

Cela peut être fait, mais ce n’est pas simple. Si vous recherchez git filter-branch , subdirectory et submodule , il y a des écritures correctes sur le processus. Cela implique essentiellement la création de deux clones de votre projet, en utilisant git filter-branch pour supprimer tout sauf le sous-répertoire dans un, et en supprimant uniquement ce sous-répertoire. Ensuite, vous pouvez établir le deuxième référentiel en tant que sous-module du premier.