nations unies-un sous-module sous-module git
Comment puis-je onu-sous-module d'un git sous-module (apporter tout le code dans le noyau) ?
Comme dans la manière "devrait" je, comme dans "le Meilleur de la procédure" ...
- Remarque: avec git1.8.3, vous pouvez maintenant essayer un
git submodule deinit
, voir ma réponse ci-dessous - Je peut mal comprendre, mais git sous-module deinit semble supprimer le code.
- Depuis git 1.8.5 (novembre 2013), un simple
git submodule deinit asubmodule ; git rm asubmodule
est assez, comme illustré dans la ma réponse ci-dessous
Vous devez vous connecter pour publier un commentaire.
Si tout ce que vous voulez est de placer votre sous-module de code dans le référentiel principal, il vous suffit de supprimer le sous-module et re-ajouter les fichiers dans le repo:
Si vous aussi vous voulez préserver l'histoire de la sous-module, vous pouvez faire un petit truc: "fusionner" le sous-module dans le référentiel principal pour que le résultat sera le même qu'avant, sauf que le sous-module fichiers sont maintenant dans le référentiel principal.
Dans le module principal, vous aurez besoin de faire ce qui suit:
L'résultant référentiel aura l'air un peu bizarre: il n'y aura plus qu'une première validation. Mais il ne causera pas de problèmes pour git.
Dans cette deuxième solution, vous aurez le grand avantage que vous pouvez toujours exécuter git le blâme ou la commande git log sur les fichiers qui ont été à l'origine dans les submodules. En fait, ce que vous avez fait ici est de renommer de nombreux fichiers à l'intérieur d'un référentiel, et git doit détection automatique de la ce. Si vous avez toujours des problèmes avec la commande git log, essayer quelques options (--suivre, -M, -C), que faire de mieux renommer/copier détection.
git merge
assure qu'il y aura un "précédent commit" pour chaque fichier (dans l'un des deux "côtés" de la fusion).mkdir foo && git mv !(foo) foo && git commit
.git merge
de commande. Pour moi, c'est simplement a immédiatement fait une "fusion message" echec de la, et les deuxgit rm
commandes après il n'a pas réussi non plus.git mv
est exactement la même que la suppression d'un fichier et l'ajout d'un nouveau nom. Si vous utilisezgit log --follow <filename>
, il permet de détecter renomme et de montrer l'histoire correctement.git merge --no-commit
)The following untracked working tree files would be overwritten by merge
et répertorie tous les fichiers dans mon sous-module.git reset --hard
n'a l'air de fonctionner, mais c'est normal les extractions et tire ne fonctionnent pas. Est-ce prévu?--allow-unrelated-histories
à la force de la fusion à la faux de fusion que j'ai été fairefatal: refusing to merge unrelated histories
, plus de détails ici: github.com/git/git/blob/master/Documentation/RelNotes/...git submodule deinit
serait mieux quegit rm .gitmodules
puisque vous pouvez avoir d'autres submodules.Depuis git 1.8.5 (Novembre 2013) (sans garder l'histoire de la sous-module):
Qui:
deinit
, d'où lemv
première),.gitmodules
pour vous (rm
),rm
).Une fois la suppression de la sous-module est complet (
deinit
etgit rm
), vous pouvez renommer le dossier à son nom d'origine et l'ajouter à la repo git comme un dossier normal.Remarque: si le sous-module a été créé par un ancien Git (< 1.8), vous devrez peut-être supprimer le imbriquée
.git
dossier dans le sous-module lui-même, comme commenté par Simon-OrientSi vous avez besoin de garder l'histoire de la sous-module, voir jsears's réponse, qui utilise
git filter-branch
.deinit
seul nettoyé l'arbre de travail à partir de votre sous-module?git submodule deinit
) est clair, mais il n'est pas supprimer l'entrée spéciale à partir de l'index, n'est ce pas?git ls-tree HEAD path/to/sub
git submodule deinit
sans avoir de l'arbre de travail de ce sous-module de disparaître, de droit,.git config --remove-section submodule.name
, comme dans stackoverflow.com/a/20097046/11343?.git/modules/xxx
), sans tous les "dépose de l'arbre de travail" de la partie.That means to really unsubmodule a submodule, you will do (git 1.8.5 or 1.9, Q4 2013) (...)
- Mais c'est faux.git submodule deinit SubModule
n'supprimer les fichiers à partir de l'arbre de travail. Si vous negit rm --cached SubModule
vos fichiers sont déjà allés à partir de l'arbre de travail.git submodule deinit SubModule
. Lors de l'utilisation de cette commande l'absence des fichiers à partir du disque. Ou puis-je obtenir quelque chose de mal?git rm --cached yourSubmodule
ne fait que supprimer les dernières traces de yourSubModule être un sous-module à droite? Alors quelle serait la configuration complète de l'onu-un sous-module sous-module tout en gardant les fichiers sur le disque? (qui doivent être ajoutés comme normal dossiers pour le projet parent)git submodule deinit yourSubmodule && git rm --cached yourSubmodule
. Puis le renommer en arrière.git submodule init && git submodule update
à tirer dans ils contiennent tous un .git dossier. Désolé pour la mise en forme.git version 1.9.1
qui est l'actuelle version stock expédié sous ubuntu..git
fichier qui l'empêche d'être engagé à la mère des pensions.git filter-branch
pour obtenir le droit de réponse. Mais de toute façon, c'est le système de contrôle de version, et la réponse que jeter de l'histoire est très mauvais, il devrait au moins mentionner le dommage de l'histoire avec audace quelque part en haut.git filter-branch
et préserve l'histoire.J'ai créé un script qui va traduire un sous-module d'un simple répertoire, tout en conservant l'historique des fichiers. Il ne souffre pas de la
git log --follow <file>
questions que les autres solutions souffrent. Il est également très facile d'une seule ligne d'invocation qui fait tout le travail pour vous. G'luck.Il s'appuie sur l'excellent travail de Lucas Jenß, décrit dans son blog "L'intégration d'un sous-module dans le dépôt parent", mais automatise l'ensemble du processus et nettoie les quelques autres cas de coin.
Le code le plus récent sera maintenu avec les corrections de bugs sur github à https://github.com/jeremysears/scripts/blob/master/bin/git-submodule-rewrite, mais pour l'amour de la bonne stackoverflow réponse de protocole, j'ai inclus la solution dans son intégralité ci-dessous.
Utilisation:
git-sous-module-réécriture:
cat .gitmodules
.git rm --cached the_submodule_path
.gitmodules
fichier, ou si c'est la seule sous-module, supprimer le fichier.git add the_submodule_path
Je n'ai pas trouvé de moyen plus facile encore. Vous pouvez compresser les 3-5 en une seule étape, par
git commit -a
- question de goût..gitmodules
au lieu de.submodules
?.gitmodules
pas.submodules
.git
répertoire de la sous-module avantgit add
, le sous-module dossierBeaucoup de réponses ici, mais tous semblent être excessivement complexe et probablement ne pas faire ce que vous voulez. Je suis sûr que la plupart des gens veulent garder leur histoire.
Pour cet exemple, les principaux repo sera
[email protected]:main/main.git
et le sous-module repo sera[email protected]:main/child.git
. Cela suppose que le sous-module est situé dans le répertoire racine de la mère des pensions. Ajuster les instructions nécessaires.Commencer par clonage de la mère repo et le retrait de l'ancien sous-module.
Maintenant, nous allons ajouter le repos de l'enfant, en amont du principal repo.
L'étape suivante suppose que vous voulez déplacer les fichiers sur la fusion de préparation de la branche dans le même emplacement que le sous-module a été ci-dessus bien que vous pouvez facilement changer l'emplacement en changeant le chemin d'accès au fichier.
déplacer tous les dossiers et fichiers à l'exception de l' .git dossier dans le dossier enfant.
Maintenant, vous pouvez simplement fusionner vos fichiers dans la branche master.
Regardez autour de vous et assurez-vous tout semble bon avant d'exécuter
git push
La seule chose que vous devez retenir, c'est maintenant que la commande git log n'est pas, par défaut, suivez les fichiers déplacés cependant, en cours d'exécution
git log --follow filename
vous pouvez voir l'historique complet de vos fichiers.git merge merge-prep
et reçu le message d'erreurfatal: refusing to merge unrelated histories
. Solution de contournement est: est-cegit merge --allow-unrelated-histories merge-prep
.child
répertoire, de sorte que vous n'avez pas à le déplacer plus tard? J'ai le même nom de fichier dans un sous-module et le principal repo... donc je viens de sortir d'un conflit de fusion puisque c'est d'essayer de fusionner les deux fichiers ensemble.Il nous est arrivé que nous avons créé 2 référentiels pour les 2 projets qui ont été ainsi couplés qui n'a pas de sens de les avoir séparés, donc nous avons fusionné entre eux.
Je vais vous montrer comment fusionner le maître des succursales dans chaque premier et puis je vais vous expliquer comment vous pouvez l'étendre à toutes les branches que vous avez, espérons qu'il vous aide.
Si vous avez obtenu le sous-module de travail, et que vous voulez convertir à un répertoire, vous pouvez le faire:
Ici, nous n'propre clone de travail. Pour ce processus, vous n'avez pas besoin d'initialiser ou mettre à jour les submodules, donc de l'ignorer.
Modifier
.gitmodules
avec votre éditeur de texte favori (ou Vim) pour supprimer le sous-module vous envisagez de remplacer. Les lignes que vous devez supprimer devrait ressembler à quelque chose comme ceci:Après l'enregistrement du fichier,
Ici, nous allons supprimer le sous-module relation complètement afin que nous puissions apporter les autres pensions pour le projet en place.
Ici, nous allons chercher le sous-module référentiel de fusionner.
Ici, nous commençons une opération de fusion des 2 référentiels, mais arrêter avant de s'engager.
Ici nous envoyer le contenu de maître dans le sous-module dans le répertoire où il était avant de précéder un nom de répertoire
Ici, nous avons terminé la procédure de faire un commit des modifications dans la fusion.
Après la finition de ce que vous pouvez pousser, et recommencer avec une autre branche de fusionner, juste la caisse de la succursale à vous référentiel qui permettra de recevoir les modifications et changement de la direction générale, vous apportant de la fusion et de la lecture de l'arbre des opérations.
directory_of_submodule
git log original_path_of_file_in_submodule
le chemin enregistré dans le repo git pour le fichier (qui n'est pas plus exister sur le système de fichiers), même si le sous-module fichier vit maintenant à l'submodule_path/new_path_of_file
La meilleure réponse à ce que j'ai trouvé est ici:
http://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html
Cet article explique la procédure très bien.
Pour quand
retourne
Contexte: je n'ai
rm -r .git*
dans mon sous-module de dossiers avant de se rendre compte qu'ils avaient besoin de submoduled dans le projet principal pour lequel j'avais juste ajouté. J'ai eu l'erreur ci-dessus lorsque de-submoduling certains, mais pas tous d'entre eux. De toute façon, je les ai fixées par la course à pied (après, bien sûr, larm -r .git*
)Noter que ce n'est pas de préserver l'histoire.
Ici est un peu une version améliorée (à mon humble avis) de l'actuel haut de réponse:
Dans un autre répertoire (de faire des erreurs plus facile à nettoyer et essayer de nouveau) découvrez le haut de repo et de la subrepo.
D'abord modifier le subrepo pour déplacer tous les fichiers dans le répertoire désiré
Faire une note de la TÊTE
Maintenant supprimer le subrepo de la principale repo
Et enfin, juste les fusionner
Et fait! En toute sécurité et sans aucune magie.
Basé sur VonC réponse, j'ai créé un simple script bash qui fait cela. Le
add
à la fin est d'utiliser des caractères génériques sinon il va annuler la dernièrerm
pour le sous-module lui-même. Il est important d'ajouter le contenu de la sous-module de répertoire, et de ne pas nommer le répertoire lui-même dans leadd
commande.Dans un fichier appelé
git-integrate-submodule
:Je l'ai trouvé plus pratique (aussi?) extraction de validation des données de la sous-module, parce que sinon, je lâche eux. (Pas pu les pousser comme je n'ai pas accès à cette distance). J'ai donc ajouté des sous-module/.git comme remote_origin2, elle est extraite s'engage et fusionné à partir de cette branche.
Vous ne savez pas si j'ai encore besoin de le sous-module à distance de l'origine, puisque je ne suis pas assez familier avec git encore.