Comment importer dépôt Git dans un autre?
J'ai un dépôt Git dans un dossier appelé XXX, et je de deuxième dépôt Git appelé YYY.
Je veux importer le XXX le dépôt dans le YYY référentiel comme un sous-répertoire nommé ZZZ et ajoutez tous les XXX's l'historique des modifications pour YYY.
Structure de dossier avant:
XXX
|- .git
|- (project files)
YYY
|- .git
|- (project files)
Structure de dossier après:
YYY
|- .git <-- This now contains the change history from XXX
|- ZZZ <-- This was originally XXX
|- (project files)
|- (project files)
Est-ce possible, ou dois-je recourir à l'aide de sous-modules?
- Sur Github, il est maintenant possible de le faire à partir de l'interface web lorsque vous créez un nouveau repo
- Double Possible de Comment faire la fusion de deux dépôts git?
Vous devez vous connecter pour publier un commentaire.
Probablement la façon la plus simple serait de tirer la XXX des choses dans une succursale dans YYY puis de les fusionner en master:
Dans YYY:
En fait je viens d'essayer avec un couple de mon repos, et cela fonctionne. Contrairement à Jörg réponse il ne sera pas vous permettre de continuer à utiliser les autres pensions, mais je ne pense pas que vous avez spécifié que, de toute façon.
Remarque: Depuis que ceci a été écrit à l'origine en 2009, git a ajouté le sous-arbre de fusion mentionné dans la réponse ci-dessous. Je serais probablement utiliser cette méthode, aujourd'hui, même si bien sûr, cette méthode ne fonctionnent toujours.
git merge -s subtree
../YYY
répertoiregit checkout -b AAA origin/AAA
, 2) interrupteur à YYY etgit fetch
, 3) d'apporter autre branche avecgit checkout -b AAA other/AAA
, 4) fusion de la porté des branchesgit merge
. (Regardez le film Inception, pour préparer votre esprit pour la nécessaire Gitfoo)git mv $(ls|grep -v <your foldername>) <your foldername>/
Cela va copier tous les fichiers et dossiers dans votre nouveau dossierboth deleted ../../*, added by us, by them
.-Xtheirs
n'a pas vraiment changer quoi que ce soit, quelqu'un sait comment rendre le contenu de ZZZ dossier à suivre les fichiers d'origine à l'emplacement et renommer/déplacer des fichiers en conséquence?Si vous souhaitez conserver l'exacte commettre l'histoire de la seconde référentiel et donc aussi la capacité de fusionner facilement en amont des changements dans l'avenir, alors voici la méthode que vous souhaitez. Il en résulte non modifiée de l'histoire de la sous-arborescence d'être importés dans votre repo plus une fusion s'engager à déplacer la fusion de dépôt de la sous-répertoire.
Vous pouvez suivre les changements en amont de la sorte:
Git chiffres sur son propre, où les racines sont avant de faire la fusion, de sorte que vous n'avez pas besoin de spécifier le préfixe sur les fusions.
Git versions avant de 2,9: Vous n'avez pas besoin de passer le
--allow-unrelated-histories
option pourgit merge
.La méthode dans l'autre réponse qui utilise
read-tree
et ignore lemerge -s ours
étape est effectivement pas différent que de copier les fichiers du cp et d'engager le résultat.Source d'origine était de github est "sous-arbre de Fusion" article d'aide.
git log
sur l'un des fichiers que j'ai tiré dans je viens de voir la seule fusion s'engager et rien de sa vie antérieure dans l'autre repo? Git 1.8.0git log
au niveau de la racine, de sorte que son une limitation de la façon dont j'ai essayé d'afficher l'historique des fichiers importés existe - il un moyen?git log -- myfile
au lieu degit log -- rack/myfile
A
dans des pensions deB
avec cette méthode, est-il alors sûr de supprimer complètement repoA
?--allow-unrelated-histories
lors de la fusion.git-sous-arborescence
est un script conçu précisément pour ce cas d'utilisation de la fusion de plusieurs référentiels dans l'un, tout en préservant l'histoire (et/ou le fractionnement de l'histoire de sous-arbres, mais qui semble indifférent à cette question). Il est distribué en tant que partie de l'arbre git depuis la version 1.7.11.Pour fusionner un référentiel
<repo>
à la révision<rev>
en tant que sous-répertoire<prefix>
, utilisezgit subtree add
comme suit:git-sous-arborescence met en œuvre la sous-arbre de fusion de la stratégie dans une manière plus conviviale.
Pour votre cas, à l'intérieur du référentiel YYY, vous devez exécuter:
git subtree add -P name-of-desired-prefix ~/location/of/git/repo-without-.git branch-name
Il est bien connu instance de cette dans le dépôt Git de lui-même, qui est collectivement connu dans le Git de la communauté comme "le plus cool de fusion jamais" (après la ligne d'objet de Linus Torvalds utilisé dans l'e-mail à l'Git liste de diffusion qui décrit cette fusion). Dans ce cas, le
gitk
Git GUI qui fait maintenant partie de Git bon, en fait utilisé pour être un projet distinct. Linus a réussi à fusionner le dépôt dans le dépôt Git de manièregit pull
ed.L'e-mail contient les étapes nécessaires pour reproduire, mais ce n'est pas pour les faibles de cœur: tout d'abord, Linus a écrit Git, donc il est probable qu'il en sait un peu plus sur le sujet que vous ou moi, et la deuxième, c'était presque 5 ans et Git a amélioré considérablement depuis, alors peut-être qu'il est maintenant beaucoup plus facile.
En particulier, je suppose que de nos jours on utilise une gitk sous-module, dans ce cas précis.
git-subtree
outil qui peut vous aider avec ceci: github.com/apenwarr/git-subtreesubtree
de fusion de la stratégie, en particulier en conjonction avec lagit-subtree
outil est un gentil, peut-être même la meilleure alternative à submodules.subtree
: blogs.atlassian.com/2013/05/...La façon simple de le faire est d'utiliser git format-patch.
Supposons que nous disposons de 2 dépôts git foo et bar.
foo contient:
bar contient:
et nous voulons finir avec foo contenant le bar histoire et ces fichiers:
Donc pour cela:
Et si nous voulons réécrire tous les messages de commits depuis la barre de nous peut le faire, par exemple sur Linux:
Cela va ajouter "[bar] " au début de chaque message de commit.
git am
échouera probablement.[ ]
à partir du message de commit. Donc, vous devriez utiliser un autre marqueur de[bar]
En fonction sur cet article, à l'aide de la sous-arborescence est ce qui a fonctionné pour moi et n'est valable que l'histoire a été transféré. Poster ici au cas où quelqu'un a besoin de l'escalier (assurez-vous de remplacer les espaces par des valeurs qui s'appliquent à vous):
dans votre répertoire source de split sous-dossier dans une nouvelle branche
git subtree split --prefix=<source-path-to-merge> -b subtree-split-result
à destination des pensions de fusion dans la fraction de résultat de la branche
vérifier vos modifications et de s'engager
N'oubliez pas de
Nettoyer par la suppression de la
subtree-split-result
branchegit branch -D subtree-split-result
Supprimer la distance que vous avez ajouté à extraire les données à partir de la source repo
git remote rm merge-source-repo
Cette fonction permet de cloner à distance pensions dans les pensions de dir, après la fusion de tous les commits seront sauvés,
git log
sera afficher l'original s'engage et le bon chemin:Comment utiliser:
Si faire un peu de changements que vous pouvez même déplacer des fichiers/répertoires de fusion des pensions dans des chemins différents, par exemple:
Avis
Chemins remplace par
sed
, alors assurez-vous qu'il a déplacé dans le bon chemin après la fusion.Le
--allow-unrelated-histories
paramètre n'existe que depuis git >= 2.9.gnu-sed
pour obtenir legit-add-repo
de la fonction de travail. Merci encore Andrey!L'ajout d'une autre réponse que je pense que c'est un peu plus simple. Un pull de repo_dest est fait dans repo_to_import et puis un push --set-en amont url:repo_dest master est fait.
Cette méthode a fonctionné pour moi l'importation de plusieurs petites repos dans un plus grand.
Comment importer: repo1_to_import à repo_dest
Renommer ou déplacer des fichiers et des répertoires dans la position désirée dans l'original repo avant de faire l'importation. par exemple,
La méthode décrite sur le lien suivant l'inspiration de cette réponse. Je l'ai aimé comme il semblait plus simple. MAIS Méfiez-vous! Il y a des dragons! https://help.github.com/articles/importing-an-external-git-repository
git push --mirror url:repo_dest
pousse vos locaux pensions de l'histoire et de l'état à distance (url:repo_dest). MAIS il supprime les anciens de l'histoire et de l'état de la télécommande. Le plaisir s'ensuit! :-EJe voulais importer que des fichiers à partir de l'autre référentiel (XXX) dans mon cas. Le sous-arbre était trop compliqué pour moi et les autres solutions ne fonctionnent pas. C'est ce que j'ai fait:
Cela vous donne un espace séparé liste de tous les changements qui affectent les fichiers que je voulais importer (ZZZ) dans l'ordre inverse (vous pourriez avoir à ajouter --suivre pour capturer renomme ainsi). Ensuite, je suis allé dans le référentiel cible (YYY), a ajouté l'autre référentiel (XXX) à distance, a fait un fetch et enfin:
qui ajoute tous les commits de votre agence, vous aurez ainsi tous les fichiers avec leur histoire et pouvez faire ce que vous voulez avec eux comme si ils ont toujours été dans ce référentiel.
J'étais dans une situation où j'ai été à la recherche pour
-s theirs
mais bien sûr, cette stratégie n'existe pas. Mon histoire c'est que j'avais fourche d'un projet sur GitHub, et maintenant, pour une raison quelconque, mon localmaster
pourrait ne pas être fusionné avecupstream/master
bien que je n'avait pas fait de modifications locales à cette branche. (Ne sais vraiment pas ce qui s'est passé là-je suppose en amont l'avaient fait certains sale pousse derrière les scènes, peut-être?)Ce que j'ai fait était
Alors maintenant, mon
master
est de nouveau en synchronisation avecupstream/master
(on peut répéter l'opération pour toutes les autres directions, vous aussi, vous souhaitez synchroniser de la même façon).git reset --hard upstream/master
sur votremaster
direction de faire le travail. De cette façon, vous ne perdez pas de succursale locale conflg – des choses comme la valeur par défaut en amont.Voir exemple de Base dans cet article et tenir compte de la cartographie sur les référentiels:
A
<->YYY
,B
<->XXX
Après toutes les activités décrites dans ce chapitre (après la fusion), retirez la branche
B-master
:Ensuite, poussez les changements.
Cela fonctionne pour moi.
Je peux vous proposer une autre solution (alternative à git-submodules) pour votre problème de gil git (liens) de l'outil
Il permet de décrire et de gérer des dépôts git dépendances.
Il fournit également une solution à la git récursive submodules problème de dépendances.
Considérer que vous avez le projet suivant dépendances:
exemple de référentiel git graphe de dépendance
Ensuite, vous pouvez définir
.gitlinks
fichier avec des dépôts rapport description:Chaque ligne de décrire git lien dans le format suivant:
Référentiel de direction à la caisse
Enfin, vous devez mettre à jour le répertoire racine de votre référentiel exemple:
Que le résultat vous aurez clone tous les projets requis et de les lier les uns aux autres d'une manière appropriée.
Si vous voulez enregistrer toutes les modifications dans certains référentiel avec toutes les modifications de l'enfant référentiels liés, vous pouvez le faire avec une seule commande:
Tirer, pousser des commandes fonctionne de manière similaire:
Gil (git liens) outil prend en charge les commandes suivantes:
Plus sur git récursive submodules problème de dépendances.
Je ne connais pas de moyen facile de le faire. Vous pouvez faire ceci:
Je peux le modifier avec des détails si cela semble intéressant.
Je pense que vous pouvez le faire à l'aide de git mv " et "git pull".
Je suis juste git noob - donc soyez prudent avec votre dépôt principal - mais j'ai juste essayé ce dans un temp dir et il semble fonctionner.
Première renommer la structure de XXX pour correspondre à la façon dont vous voulez qu'il ressemble quand il est dans YYY:
Maintenant XXX ressemble à ceci:
Maintenant utiliser "git pull" pour récupérer les modifications dans:
Maintenant YYY ressemble à ceci: