J'ai une application Web qui explore d'autres applications Web d'une manière particulière. Il contient des démos Web dans un demos
dossier et l'une des démos devrait maintenant avoir son propre référentiel. Je voudrais créer un référentiel séparé pour cette application de démonstration et en faire unsous-paquet sous-module du référentiel principal sans perdre son historique de validation.
Est-il possible de conserver l'historique de validation des fichiers dans le dossier d'un référentiel et de créer un référentiel à partir de celui-ci et de l'utiliser à la place comme sous - module ?
git
git-submodules
revision-history
GabLeRoux
la source
la source
Réponses:
Solution détaillée
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:
Dans les étapes ci-dessous, je ferai référence à cela
someLib
comme<directory 1>
.À la fin, nous aurons quelque chose comme ceci:
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.
Étape 2
Le dossier actuel sera le nouveau référentiel donc supprimez la télécommande actuelle.
Étape 3
Extraire l'historique du dossier souhaité et le valider
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!
Vous devrez peut-être définir la
upstream
branche pour votre premier pushNettoyer
<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
Remplacez
<directory 1>
par le dossier que vous souhaitez supprimer.-r
le fera récursivement dans le répertoire spécifié :). Maintenant poussezorigin/master
avec--force
Boss Stage (voir la note ci-dessous)
Créer un sous - module de
<git repository B>
dans<git repository A>
Vérifiez si tout a fonctionné comme prévu et
push
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 :
npm init
dans les deux référentielsnpm install --save git://github.com/user/project.git#commit-ish
là où vous voulez que vos dépendances soient installéesla source
cd someLib
avant l'étape 2? Vous dites "Le dossier actuel sera le nouveau référentiel" mais en réalité ce ne sera pas le cas; le nouveau référentiel (sous-module) se trouve dans ce dossier.refs/original/...
qui est créé à l'étape 3.La solution de @GabLeRoux écrase les branches et les validations associées.
Un moyen simple de cloner et de conserver toutes ces branches et commits supplémentaires:
1 - Assurez-vous d'avoir cet alias git
2 - Clonez la télécommande, tirez toutes les branches, changez la télécommande, filtrez votre répertoire, poussez
la source
La solution de GabLeRoux fonctionne bien sauf si vous utilisez
git lfs
et contient des fichiers volumineux sous le répertoire que vous souhaitez détacher. Dans ce cas, après l'étape 3, tous les fichiers volumineux resteront des fichiers de pointeur au lieu de fichiers réels. Je suppose que c'est probablement dû au fait que le.gitattributes
fichier a été supprimé dans le processus de branche de filtre.En réalisant cela, je trouve que la solution suivante fonctionne pour moi:
Copie de
.gitattributes
ce que git lfs utilise pour suivre les gros fichiers dans le.git/
répertoire pour éviter d'être supprimés.Lorsque filter-branch est terminé, n'oubliez pas de remettre le
.gitattributes
si vous voulez toujours utiliser git lfs pour le nouveau dépôt:la source