Solution détaillée
Voir la note à la fin de cette réponse (dernier paragraphe) pour une alternative rapide aux sous-modules git utilisant npm;)
Dans la réponse suivante, vous saurez comment extraire un dossier d'un référentiel et en créer un référentiel git, puis l'inclure en tant que sous - module au lieu d'un dossier.
Inspiré de l'article de Gerg Bayer, Déplacer des fichiers d'un référentiel Git à un autre, Préserver l'historique
Au début, nous avons quelque chose comme ceci:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
Dans les étapes ci-dessous, je ferai référence à cela someLib
comme <directory 1>
.
À la fin, nous aurons quelque chose comme ceci:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Créer un nouveau référentiel git à partir d'un dossier dans un autre référentiel
Étape 1
Obtenez une nouvelle copie du référentiel à fractionner.
git clone <git repository A url>
cd <git repository A directory>
Étape 2
Le dossier actuel sera le nouveau référentiel donc supprimez la télécommande actuelle.
git remote rm origin
Étape 3
Extraire l'historique du dossier souhaité et le valider
git filter-branch --subdirectory-filter <directory 1> -- --all
Vous devriez maintenant avoir un référentiel git avec les fichiers de directory 1
la racine de votre dépôt avec tout l'historique de validation associé.
Étape 4
Créez votre référentiel en ligne et transférez votre nouveau référentiel!
git remote add origin <git repository B url>
git push
Vous devrez peut-être définir la upstream
branche pour votre premier push
git push --set-upstream origin master
Nettoyer <git repository A>
(facultatif, voir les commentaires)
Nous voulons supprimer les traces (fichiers et historique des validations) de <git repository B>
from <git repository A>
afin que l'historique de ce dossier ne soit présent qu'une seule fois.
Ceci est basé sur la suppression des données sensibles de github.
Allez dans un nouveau dossier et
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Remplacez <directory 1>
par le dossier que vous souhaitez supprimer. -r
le fera récursivement dans le répertoire spécifié :). Maintenant poussez origin/master
avec--force
git push origin master --force
Boss Stage (voir la note ci-dessous)
Créer un sous - module de <git repository B>
dans<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Vérifiez si tout a fonctionné comme prévu et push
git push origin master
Remarque
Après avoir fait tout cela, j'ai réalisé dans mon cas qu'il était plus approprié d'utiliser npm pour gérer mes propres dépendances à la place. Nous pouvons spécifier les URL et les versions de git, voir les urls de package.json git comme dépendances .
Si vous le faites de cette façon, le dépôt que vous souhaitez utiliser comme une exigence doit être un module de NPM il doit contenir un package.json
fichier ou vous obtiendrez cette erreur: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (solution alternative)
Vous trouverez peut-être plus facile d'utiliser npm et de gérer les dépendances avec les urls git :
- Déplacer le dossier vers un nouveau référentiel
- s'exécuter
npm init
dans les deux référentiels
- exécuter
npm install --save git://github.com/user/project.git#commit-ish
là où vous voulez que vos dépendances soient installées