Comment faire pour ONU-sous-module un sous-module git (ramener tout le code dans le noyau) ?
Comme dans Comment « devrait » j’ai, comme dans « Procédure Best »...
Comment faire pour ONU-sous-module un sous-module git (ramener tout le code dans le noyau) ?
Comme dans Comment « devrait » j’ai, comme dans « Procédure Best »...
Si vous désirez vous mettre à 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:
git rm --cached submodule_path # delete reference to submodule HEAD (no trailing slash)
git rm .gitmodules # if you have more than one submodules,
# you need to edit this file instead of deleting!
rm -rf submodule_path/.git # make sure you have backup!!
git add submodule_path # will add files instead of commit reference
git commit -m "remove submodule"
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:
# Fetch the submodule commits into the main repository
git remote add submodule_origin git://url/to/submodule/origin
git fetch submodule_origin
# Start a fake merge (won't change any files, won't commit anything)
git merge -s ours --no-commit submodule_origin/master
# Do the same as in the first solution
git rm --cached submodule_path # delete reference to submodule HEAD
git rm .gitmodules # if you have more than one submodules,
# you need to edit this file instead of deleting!
rm -rf submodule_path/.git # make sure you have backup!!
git add submodule_path # will add files instead of commit reference
# Commit and cleanup
git commit -m "removed submodule"
git remote rm submodule_origin
Le 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 autodetect. Si vous avez toujours des problèmes avec la commande git log, essayer quelques options (--suivre, -M, -C), que faire de mieux renommer/copier de détection.
Il devrait maintenant être plus facile que la réponse précédente, avec cette nouvelle commande (git1.8.3, 22 avril 2013):
git submodule deinit
Voir "Comment puis-je supprimer un Git sous-module?"
Il va supprimer le sous-module pour l' .git/config
le fichier et d' .git/modules/xxx
, et de décharger le sous-module:
Annuler l'enregistrement de la donnée submodules, c'est à dire enlever l'ensemble de l'
submodule.$name
de la section de .git/config avec leur travail de l'arbre.
Mais pas de l' .gitmodules
le fichier, et non pas à partir de l'index.
CharlesB points (dans les commentaires) "puis-je faire une "copie" d'un dépôt git avec submodules?":
git config --remove-section submodule.name
Que serait semblable à l' git submodule deinit
, sans déchargement de la sous-module à partir de l'arbre de travail.
git 1.8.5 permettra bientôt: git rm yourSubmodule
prendre soin de tout le reste (.gitmodules
d'entrée et entrée spécial d'index).
Qui:
.gitmodules
pour vous, Que signifie vraiment le unsubmodule un sous-module, vous allez faire (git 1.8.5 ou à 1,9% pour le T4 2013)
git submodule deinit yourSubmodule
git rm --cached yourSubmodule
De cette façon, vous gardez le code dans votre arbre de travail (en raison de l' --cached
option de git rm
), mais le"yourSubmodule
' dossier n'est plus un sous-module.
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é.
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:
git clone project_uri project_name
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.
cd project_name
vim .gitmodules
Edit .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:
[submodule "lib/asi-http-request"]
path = lib/asi-http-request
url = https://github.com/pokeb/asi-http-request.git
Après avoir enregistré le fichier,
git rm --cached directory_of_submodule
git commit -am "Removed submodule_name as submodule"
rm -rf directory_of_submodule
Ici, nous allons supprimer le sous-module relation complètement afin que nous puissions apporter les autres pensions pour le projet en place.
git remote add -f submodule_origin submodule_uri
git fetch submodel_origin/master
Ici, nous allons chercher le sous-module référentiel de fusionner.
git merge -s ours --no-commit submodule_origin/master
Ici, nous commençons une opération de fusion des 2 référentiels, mais arrêter avant de s'engager.
git read-tree --prefix=directory_of_submodule/ -u submodule_origin/master
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
git commit -am "submodule_name is now part of main project"
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.
Voici une version légèrement 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.
git clone ../main_repo main.tmp
git clone ../main_repo/sub_repo sub.tmp
D'abord modifier le subrepo pour déplacer tous les fichiers dans le répertoire désiré
cd sub.tmp
mkdir sub_repo_path
git mv `ls | grep -v sub_repo_path` sub_repo_path/
git commit -m "Moved entire subrepo into sub_repo_path"
Prenez note de la TÊTE
SUBREPO_HEAD=`git reflog | awk '{ print $1; exit; }'`
Maintenant, enlevez le subrepo de la principale repo
cd ../main.tmp
rmdir sub_repo_path
vi .gitmodules # remove config for submodule
git add -A
git commit -m "Removed submodule sub_repo_path in preparation for merge"
Et enfin, juste les fusionner
git fetch ../sub.tmp
git merge $SUBREPO_HEAD
Et fait! En toute sécurité et sans aucune magie.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.