Comment annuler le sous-module d'un sous-module git (ramener tout le code dans le noyau)?
Comme dans la façon dont «dois-je», comme dans «Meilleure procédure» ...
git
git-submodules
Quickredfox
la source
la source
git submodule deinit
, voir ma réponse cigit submodule deinit asubmodule ; git rm asubmodule
suffit, comme illustré dans ma réponse ciRéponses:
Si tout ce que vous voulez est de mettre votre code de sous-module dans le référentiel principal, il vous suffit de supprimer le sous-module et de rajouter les fichiers dans le référentiel principal:
Si vous souhaitez également conserver l'historique du sous-module, vous pouvez faire une petite astuce: "fusionner" le sous-module dans le référentiel principal afin que le résultat soit le même qu'avant, sauf que les fichiers du sous-module sont maintenant dans le référentiel principal.
Dans le module principal, vous devrez effectuer les opérations suivantes:
Le dépôt résultant aura l'air un peu bizarre: il y aura plus d'un commit initial. Mais cela ne causera aucun problème pour git.
Dans cette deuxième solution, vous aurez le gros avantage que vous pouvez toujours exécuter git blame ou git log sur les fichiers qui étaient à l'origine dans les sous-modules. En fait, ce que vous avez fait ici, c'est de renommer de nombreux fichiers dans un même référentiel, et git devrait le détecter automatiquement. Si vous rencontrez toujours des problèmes avec git log, essayez certaines options (--follow, -M, -C) qui permettent de mieux renommer / copier la détection.
la source
git merge
garantit qu'il y aura un "commit précédent" pour chaque fichier (sur l'un des deux "côtés" de la fusion).mkdir foo && git mv !(foo) foo && git commit
.--allow-unrelated-histories
pour forcer la fusion lors de la fausse fusion pendant que j'obtenaisfatal: refusing to merge unrelated histories
, plus ici: github.com/git/git/blob/master/Documentation/RelNotes/…Depuis git 1.8.5 (novembre 2013 ) ( sans conserver l'historique du sous-module ):
Cela va:
deinit
, d'où lemv
premier ),.gitmodules
pour vous (rm
),rm
).Une fois le retrait du sous-module terminé (
deinit
etgit rm
), vous pouvez renommer le dossier en son nom d'origine et l'ajouter au dépôt git en tant que dossier normal.Note: 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 EstSi vous devez conserver l'historique du sous-module, voir la réponse de jsears , qui utilise .
git filter-branch
la source
deinit
seul a nettoyé l'arbre de travail de votre sous-module?J'ai créé un script qui traduira un sous-module dans un répertoire simple, tout en conservant tout l'historique des fichiers. Il ne souffre pas des
git log --follow <file>
problèmes dont souffrent les autres solutions. C'est aussi une invocation d'une ligne très simple qui fait tout le travail pour vous. Bonne chance.Il s'appuie sur l'excellent travail de Lucas Jenß, décrit dans son article de blog " Intégrer un sous-module dans le référentiel parent ", mais automatise l'ensemble du processus et nettoie quelques autres cas d'angle.
Le dernier code sera maintenu avec des corrections de bugs sur github à https://github.com/jeremysears/scripts/blob/master/bin/git-submodule-rewrite , mais pour le bien du protocole de réponse stackoverflow, j'ai inclus le solution dans son intégralité ci-dessous.
Usage:
git-submodule-rewrite:
la source
curl https://raw.githubusercontent.com/jeremysears/scripts/master/bin/git-submodule-rewrite > git-submodule-rewrite.sh
et./git-submodule-rewrite.sh <submodule-name>
git rm --cached the_submodule_path
.gitmodules
fichier ou, s'il s'agit du seul sous-module, supprimez le fichier.git add the_submodule_path
Je n'ai pas encore trouvé de moyen plus simple. Vous pouvez compresser 3-5 en une seule étape via
git commit -a
- question de goût.la source
.gitmodules
lieu de.submodules
?.gitmodules
pas être le cas.submodules
.git
répertoire du sous-module avant degit add
travailler sur le dossier du sous-moduleBeaucoup de réponses ici, mais toutes semblent trop complexes et ne font probablement pas ce que vous voulez. Je suis sûr que la plupart des gens veulent garder leur histoire.
Pour cet exemple, le dépôt principal sera
[email protected]:main/main.git
et le dépôt de sous-module sera[email protected]:main/child.git
. Cela suppose que le sous-module se trouve dans le répertoire racine du référentiel parent. Ajustez les instructions selon vos besoins.Commencez par cloner le référentiel parent et supprimer l'ancien sous-module.
Nous allons maintenant ajouter les dépôts enfants en amont au référentiel principal.
L'étape suivante suppose que vous souhaitez déplacer les fichiers de la branche merge-prep dans le même emplacement que le sous-module était au-dessus, bien que vous puissiez facilement changer l'emplacement en changeant le chemin du fichier.
déplacer tous les dossiers et fichiers sauf le dossier .git dans le dossier enfant.
Maintenant, vous pouvez simplement fusionner vos fichiers dans la branche principale.
Regardez autour de vous et assurez-vous que tout a l'air bien avant de courir
git push
La seule chose que vous devez vous rappeler maintenant est que git log ne suit pas par défaut les fichiers déplacés, mais en exécutant,
git log --follow filename
vous pouvez voir l'historique complet de vos fichiers.la source
git merge merge-prep
et j'ai reçu l'erreurfatal: refusing to merge unrelated histories
. Solution est la suivante:git merge --allow-unrelated-histories merge-prep
.child
répertoire, vous n'avez donc pas à les déplacer plus tard? J'ai les mêmes noms de fichiers dans un sous-module et le référentiel principal ... donc je reçois juste un conflit de fusion car il essaie de fusionner les deux fichiers ensemble.Il nous est arrivé que nous avons créé 2 référentiels pour 2 projets qui étaient tellement couplés qu'il n'était pas logique de les séparer, alors nous les avons fusionnés.
Je vais montrer comment fusionner les branches principales dans chaque première, puis je vais expliquer comment vous pouvez l'étendre à toutes les branches que vous avez, j'espère que cela vous aidera.
Si vous avez fait fonctionner le sous-module et que vous souhaitez le convertir en un répertoire en place, vous pouvez faire:
Ici, nous faisons un clone propre pour travailler. Pour ce processus, vous n'avez pas besoin d'initialiser ou de mettre à jour les sous-modules, alors sautez-le simplement.
Modifiez
.gitmodules
avec votre éditeur préféré (ou Vim) pour supprimer le sous-module que vous prévoyez de remplacer. Les lignes que vous devez supprimer devraient ressembler à ceci:Après avoir enregistré le fichier,
Ici, nous supprimons complètement la relation de sous-module afin que nous puissions créer mettre en place l'autre référentiel dans le projet.
Ici, nous récupérons le référentiel de sous-modules à fusionner.
Ici, nous commençons une opération de fusion des 2 référentiels, mais nous arrêtons avant de valider.
Ici, nous envoyons le contenu de master dans le sous-module au répertoire où il était avant de préfixer un nom de répertoire
Ici, nous terminons la procédure en validant les modifications de la fusion.
Après avoir terminé cela, vous pouvez pousser et recommencer avec n'importe quelle autre branche à fusionner, il suffit de retirer la branche dans votre référentiel qui recevra les modifications et de changer la branche que vous apportez dans les opérations de fusion et de lecture.
la source
directory_of_submodule
git log original_path_of_file_in_submodule
ie le chemin enregistré dans le dépôt git pour le fichier (qui n'existe plus sur le système de fichiers) même si le fichier de sous-module vit maintenant àsubmodule_path/new_path_of_file
La meilleure réponse à cela que j'ai trouvée est ici:
http://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html
Cet article explique très bien la procédure.
la source
Voici une version légèrement améliorée (IMHO) de la réponse de @ gyim. Il fait un tas de changements dangereux dans la copie de travail principale, où je pense qu'il est beaucoup plus facile d'opérer sur des clones séparés et de les fusionner à la fin.
Dans un répertoire séparé (pour faciliter le nettoyage des erreurs et réessayer), consultez à la fois le référentiel supérieur et le sous-référentiel.
Modifiez d'abord le sous-référentiel pour déplacer tous les fichiers dans le sous-répertoire souhaité
Prenez note de la TÊTE
Maintenant, supprimez le subrepo du référentiel principal
Et enfin, juste les fusionner
Et.. Voila! En toute sécurité et sans aucune magie.
la source
subrepo
avec des trucs dedans?git merge $SUBREPO_HEAD fatal: refusing to merge unrelated histories
Dois-je utilisergit merge $SUBREPO_HEAD --allow-unrelated-histories
dans ce cas? Ou devrait-il fonctionner sans et j'ai fait une erreur?Lorsque
Retour
Contexte: je l'ai fait
rm -r .git*
dans mes dossiers de sous-module avant de réaliser qu'ils devaient être dé-sous-modulés dans le projet principal auquel je venais de les ajouter. J'ai eu l'erreur ci-dessus lors du dé-sous-module de certains, mais pas tous. Quoi qu'il en soit, je les ai réparés en exécutant, (après, bien sûr, lerm -r .git*
)Notez que cela ne préserve pas l'histoire.
la source
Sur la base de la réponse de VonC , j'ai créé un simple script bash qui fait cela. À
add
la fin, il doit utiliser des caractères génériques, sinon il annulera le précédentrm
pour le sous-module lui-même. Il est important d'ajouter le contenu du répertoire du sous-module et de ne pas nommer le répertoire lui-même dans laadd
commande.Dans un fichier appelé
git-integrate-submodule
:la source
J'ai trouvé plus pratique de récupérer (également?) Les données de validation locales du sous-module, car sinon je les perdrais. (Impossible de les pousser car je n'ai pas accès à cette télécommande). J'ai donc ajouté le sous-module / .git en tant que remote_origin2, récupéré les validations et fusionné à partir de cette branche. Je ne sais pas si j'ai toujours besoin de la télécommande du sous-module comme origine, car je ne suis pas encore assez familier avec git.
la source
Voici ce que j'ai trouvé le meilleur et le plus simple.
Dans le référentiel de sous-module, à partir de HEAD, vous souhaitez fusionner dans le référentiel principal:
git checkout -b "mergeMe"
mkdir "foo/bar/myLib/"
(chemin identique à celui où vous voulez les fichiers sur le référentiel principal)git mv * "foo/bar/myLib/"
(déplacez tout dans le chemin)git commit -m "ready to merge into main"
Retour au dépôt principal après avoir retiré le sous-module et effacé le chemin "foo / bar / myLib":
git merge --allow-unrelated-histories SubmoduleOriginRemote/mergeMe
boom fait
histoires préservées
pas de soucis
Notez cela presque identique à certaines autres réponses. Mais cela suppose que vous possédez un dépôt de sous-module. Cela permet également d'obtenir facilement les futures modifications en amont du sous-module.
la source