Wie importiere ich ein bestehendes Git Repository in ein anderes?
Habe ich ein Git-repository in einem Ordner namens " XXXund ich habe das zweite Git-repository namens YYY.
Ich importieren wollen XXX - repository in den YYY repository als Unterverzeichnis mit dem Namen ZZZ und fügen Sie alle XXX's Geschichte ändern zu YYY.
Ordner-Struktur vor:
XXX
|- .git
|- (project files)
YYY
|- .git
|- (project files)
Ordner-Struktur nach:
YYY
|- .git <-- This now contains the change history from XXX
|- ZZZ <-- This was originally XXX
|- (project files)
|- (project files)
Kann das getan werden, oder muss ich in dem resort, mit sub-Module?
InformationsquelleAutor der Frage Vijay Patel | 2009-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wahrscheinlich die einfachste Möglichkeit wäre, ziehen die XXX Sachen in eine Filiale in YYY und dann merge in master:
YYY:
Ich eigentlich nur versucht, diese mit ein paar von meinen repos und es funktioniert. Im Gegensatz zu Jörg ' s Antwort es nicht zulassen, Sie weiterhin zu nutzen das andere repo, aber ich glaube nicht, dass Sie angegeben, dass sowieso.
Hinweis: Da dies ursprünglich geschrieben wurde, im Jahr 2009, git Hinzugefügt hat, die Teilbaum-merge erwähnt in der Antwort unten. Ich würde wahrscheinlich benutzen diese Methode heute noch, obwohl natürlich diese Methode funktioniert immer noch.
InformationsquelleAutor der Antwort ebneter
Wenn Sie behalten möchten die genaue commit-Historie des zweiten repository und daher auch weiterhin in der Lage sein, um Sie leicht merge-upstream-änderungen in der Zukunft, dann ist hier die Methode, die Sie wollen. Es ergibt sich in unveränderter Geschichte des teilbaums importiert werden, die in Ihrem repo-plus einen merge-commit zu bewegen, die zusammengeführt repository das Unterverzeichnis.
Können Sie verfolgen änderungen im upstream etwa so:
Git Figuren auf seine eigene, wo die Wurzeln sind, bevor Sie den Seriendruck, so dass Sie nicht brauchen, um geben Sie das Präfix auf die nachfolgende übergeht.
GIT 2.9+: mit Dem merge-Befehl benötigen Sie die option:
--allow-unrelated-histories
. Danke @stuXnet!Die Methode in der anderen Antwort, die verwendet
read-tree
und überspringt diemerge -s ours
Schritt ist effektiv nicht anders als das kopieren der Dateien mit " cp " und Begehen das Ergebnis.Ursprüngliche Quelle war von github ist "Subtree Merge" - Hilfe-Artikel.
InformationsquelleAutor der Antwort ColinM
git-subtree
ist ein Skript entworfen für genau diesen Anwendungsfall der Zusammenführung mehrerer repositories in einer unter Wahrung der Geschichte (und/oder Spaltung der Geschichte von teilbäumen, aber das scheint irrelevant zu sein auf diese Frage). Es verteilt als Bestandteil des git-Baum seit Version 1.7.11.Merge repository
<repo>
revision<rev>
als Unterverzeichnis<prefix>
verwendengit subtree add
wie folgt:git-subtree implementiert die Teilbaum-merge-Strategie in benutzerfreundlicher Art und Weise.
Für Ihren Fall, innen-repository YYY, Sie laufen würde:
InformationsquelleAutor der Antwort kynan
Es ist eine bekannte Instanz dieses in der Git-repository selbst, das ist allgemein bekannt in der Git community als "die coolsten verschmelzen immer" (nach der Betreff-Zeile Linus Torvalds die e-mail an die Git-Mailingliste beschreibt das Zusammenführen). In diesem Fall, die
gitk
Git-GUI, die ist jetzt Teil von Git ordnungsgemäße, tatsächlich verwendet werden, um ein separates Projekt. Linus verwaltet, zu verschmelzen, das repository in das Git-repository in einer Weise, dassgit pull
ed.Die e-mail enthält die erforderlichen Schritte zum reproduzieren, aber es ist nicht für das schwache des Herzens: erste, Linus schrieb Git, so dass er wohl weiß etwas mehr darüber als du oder ich, und die zweite, das war vor fast 5 Jahren und Git hat sich verbessert deutlich seitdem, also vielleicht ist es jetzt viel einfacher.
In allem, ich denke, heutzutage würde man mit einem gitk-Submodul, in diesem speziellen Fall.
InformationsquelleAutor der Antwort Jörg W Mittag
Den einfachen Weg, das zu tun, ist die Verwendung von git-format-patch.
Angenommen, wir haben 2 git repositories foo und bar.
foo enthält:
bar enthält:
und wir wollen zu Ende-up mit foo mit der bar Geschichte und diese Dateien:
Damit zu tun, dass:
Und wenn wir wollen, neu zu schreiben, alle Nachrichten-übertragungen aus der bar, die wir tun können, zB auf Linux:
Diese fügen "[bar] " am Anfang jeder commit-Nachricht.
InformationsquelleAutor der Antwort Damien R.
Basiert zu diesem Artikelmit Teilbaum ist was für mich gearbeitet und nur anwendbar, Geschichte übertragen wurde. Posting hier im Fall, jemand Bedürfnisse der Schritte (bitte ersetzen Sie die Platzhalter mit Werten, die auf Sie anwendbar):
in Ihrem Quellcode-repository split Unterordner in einen neuen branch
git subtree split --prefix=<source-path-to-merge> -b subtree-split-result
in Ihrer Ziel-repo verschmelzen in der split-Ergebnis Zweig
überprüfen Sie Ihre änderungen, und verpflichten
Vergessen Sie nicht,
Bereinigen durch löschen der
subtree-split-result
Zweiggit branch -D subtree-split-result
Entfernen Sie die Fernbedienung, die Sie Hinzugefügt, um das abrufen der Daten von der Quelle repo
git remote rm merge-source-repo
InformationsquelleAutor der Antwort Alex
Hinzufügen einer weiteren Antwort, da ich denke, das ist ein bisschen einfacher. Ein ziehen von repo_dest erfolgt in repo_to_import und dann eine push --set-upstream-url:repo_dest master ist fertig.
Diese Methode hat bei mir geklappt importieren mehrere kleinere repos in ein größeres.
Wie zu importieren: repo1_to_import zu repo_dest
Umbenennen oder verschieben von Dateien und Verzeichnissen in die gewünschte position im original-repo vor dem import. z.B.
Beschriebene Methode auf den folgenden link, inspiriert diese Antwort. Ich mochte es, wie es schien einfacher. ABER Vorsicht! Es werden Drachen! https://help.github.com/articles/importing-an-external-git-repository
git push --mirror url:repo_dest
schiebt Ihre lokale repo-Geschichte und Staat-Fernbedienung (url:repo_dest). ABER es löscht die alte Geschichte und den Zustand der Fernbedienung. Spaß macht es! :-EInformationsquelleAutor der Antwort gaoithe
Wollte ich importieren, nur einige Dateien aus dem anderen repository (XXX) in meinem Fall. Der Teilbaum war zu kompliziert für mich und die anderen Lösungen nicht funktionieren. Dies ist, was ich getan habe:
Dieser gibt Sie eine durch Leerzeichen getrennte Liste aller änderungen, die Auswirkungen auf die Dateien, die ich importieren wollte (ZZZ) in umgekehrter Reihenfolge (die Sie haben könnten hinzufügen --Folgen zu erfassen benennt). Ich ging dann in das Ziel-repository aus (YYY), noch die anderen repository (XXX) remote, hat ein abrufen aus, und schließlich:
wodurch alle verpflichtet, die auf Ihren Zweig, Sie haben also alle Dateien, die mit Ihrer Geschichte und tun können, was Sie wollen mit Ihnen, als ob Sie schon immer in diesem repository.
InformationsquelleAutor der Antwort Sebastian Blask
Diese Funktion clone remote-repo in das lokale repo dir, nach der Fusion alle commits gespeichert werden,
git log
wird zeigen, dem original verpflichtet und richtige Wege:Wie zu verwenden:
Wenn etwas änderungen, die Sie können sogar verschieben von Dateien/Verzeichnissen zusammengeführt repo in verschiedene Wege, zum Beispiel:
Hinweise
Pfade ersetzt über
sed
, so stellen Sie sicher, dass es verschoben in richtige Pfade nach der Zusammenführung.Die
--allow-unrelated-histories
parameter existiert nur, da git >= 2.9.InformationsquelleAutor der Antwort Andrey Izman
War ich in einer situation, wo ich war auf der Suche nach
-s theirs
aber natürlich auch, dass diese Strategie existiert nicht. Meine Geschichte war, ich hatte gegabelt, ein Projekt auf GitHub, und jetzt aus irgendeinem Grund, meine lokalemaster
konnte nicht zusammengeführt werden mitupstream/master
ich hatte zwar gemacht keine der lokalen änderungen zu diesem Zweig. (Weiß nicht wirklich, was da passiert ist-ich glaube, upstream getan hatte einige schmutzige schiebt sich hinter den kulissen vielleicht?)Was ich am Ende tun war
So, jetzt meine
master
ist wieder in sync mitupstream/master
(und man konnte wiederholen Sie den oben für jede andere Branche auch Sie synchronisieren möchten ähnlich).InformationsquelleAutor der Antwort tripleee
Sehen einfaches Beispiel in dieser Artikel und betrachten eine solche Zuordnung auf Repositorys:
A
<->YYY
B
<->XXX
Nachdem alle Aktivitäten die in diesem Kapitel beschrieben (nach der Zusammenführung), entfernen Zweig
B-master
:Dann drücken Sie die änderungen.
Es funktioniert für mich.
InformationsquelleAutor der Antwort VeLKerr
Ich weiß nicht, der eine einfache Möglichkeit, das zu tun. Sie KÖNNTEN dies tun:
Kann ich Bearbeiten, mit details, wenn das klingt Ansprechend.
InformationsquelleAutor der Antwort Walter Mundt
Ich denke, Sie können dies tun, mit "git mv' und 'git pull'.
Ich bin ein fair-git-noob - also seien Sie vorsichtig mit Ihrem Haupt-repository - aber ich habe nur versucht, diese in ein temp-dir und es scheint zu funktionieren.
Erste - benennen Sie die Struktur von XXX zu passen, wie Sie möchten, es zu schauen, wenn es innerhalb YYY:
XXX sieht wie folgt aus:
Nun benutzen Sie 'git pull' zu Holen, die änderungen über:
Nun YYY sieht wie folgt aus:
InformationsquelleAutor der Antwort Aaron