Verschieben von Git-Repository-Inhalten in ein anderes Repository, wobei der Verlauf erhalten bleibt


141

Ich versuche, nur den Inhalt eines repo1Repositorys ( repo2) mit den folgenden Befehlen in ein anderes vorhandenes Repository ( ) zu verschieben:

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

Aber es funktioniert nicht. Ich habe einen ähnlichen Beitrag überprüft, aber nur einen gefunden, der den Ordner verschiebt, nicht den Inhalt.


Möchten Sie den Inhalt von repo1 als Zweig auf repo2 oder als Teil von master haben, damit die Ordner beider Repos in Ihrem Arbeitsverzeichnis nebeneinander existieren?
Chronial

Ich möchte es als Teil des Meisters bewegen.
Mario

4
Dieses Tutorial ist perfekt! smashingmagazine.com/2014/05/19/…
xpto

Antworten:


242

Ich denke, die Befehle, nach denen Sie suchen, sind:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

Danach repo2/masterwird alles von repo2/masterund enthalten repo1/master, und wird auch die Geschichte von beiden haben.


Danke Chronial, ich möchte nur sicherstellen, dass das Repo1 auch einen Zweig hat und was ist, wenn ich diesen Zweig auch nach Repo2 verschieben möchte?
Mario

Nun, hat repo2 auch einen zweiten Zweig? Oder was soll mit diesem Zweig passieren?
Chronial

1
Chronial, die oben genannten Befehle haben nicht funktioniert! es hat die Geschichte nicht kopiert.
Mario

1
OK, jetzt hat es funktioniert. Ich habe den folgenden Befehl verwendet: cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda Die einfachste Lösung wäre, einfach alles repo1in einen Unterordner (innerhalb repo1) zu verschieben, bevor Sie die Zusammenführung durchführen.
Chronial

55

Perfekt beschrieben hier https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

Zuerst müssen wir alle Remote-Zweige und -Tags aus dem vorhandenen Repository in unseren lokalen Index abrufen:

git fetch origin

Wir können nach fehlenden Zweigen suchen, die wir benötigen, um eine lokale Kopie von zu erstellen:

git branch -a

Verwenden wir die SSH-geklonte URL unseres neuen Repositorys, um eine neue Fernbedienung in unserem vorhandenen lokalen Repository zu erstellen:

git remote add new-origin git@github.com:manakor/manascope.git

Jetzt können wir alle lokalen Zweige und Tags auf die neue Fernbedienung mit dem Namen new-origin übertragen:

git push --all new-origin 
git push --tags new-origin

Machen wir new-origin zur Standardfernbedienung:

git remote rm origin

Benennen Sie new-origin in just origin um, damit es zur Standardfernbedienung wird:

git remote rename new-origin origin

4
Kann bestätigen, dass dies den gesamten Verlauf und die Tags kopiert. Sehr schön. Vielen Dank.
Alex

Wenn der neue Ursprung kein Commit hat, funktioniert er gut. Wenn es jedoch ein Commit im neuen Ursprung gibt, wird der hier erwähnte Weg nicht wie erwartet formuliert.
Caot

Sie müssen die Zweige wechseln und git checkout BranchNamedann den Zweig erneut auf Remote Repo drücken, git push --all new-origin aber vielen Dank
Raad Altaie

21

Wenn Sie die vorhandenen Zweige beibehalten und die Historie festlegen möchten, haben Sie hier eine Möglichkeit gefunden.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Angenommen, Sie möchten die Quell- und Ziel-Repos für einen bestimmten Zeitraum synchron halten. Beispielsweise gibt es im aktuellen Remote-Repo noch Aktivitäten, die Sie auf das neue / Ersatz-Repo übertragen möchten.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

So rufen Sie die neuesten Updates ab (vorausgesetzt, Sie haben keine lokalen Änderungen):

git checkout {branch(es) of interest}
git pull old
git push --all new

NB: Ich habe noch keine Submodule verwendet, daher weiß ich nicht, welche zusätzlichen Schritte erforderlich sein könnten, wenn Sie sie haben.


1
Das hat bei mir einfach und problemlos funktioniert. Ich denke, es sollte die überprüfte Antwort sein. Wenn Sie 60 Filialen haben, ist dies der richtige Weg.
Rickfoosusa

7

Einfachster Ansatz: Wenn der Code bereits von Git verfolgt wird, legen Sie ein neues Repository als Ihren "Ursprung" fest, zu dem Sie pushen möchten.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

Dies funktionierte, um mein lokales Repo (einschließlich Verlauf) auf mein Remote-Repo von github.com zu verschieben. Nachdem ich das neue leere Repo bei GitHub.com erstellt habe, verwende ich die URL in Schritt drei unten und es funktioniert großartig.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

Ich fand dies unter: https://gist.github.com/niksumeiko/8972566


1
Dies ist der einfachste Weg, um das ursprüngliche Repository zu lassen. Es werden auch alle Zweige kopiert.
Guillermo

1
Dadurch werden auch alle Tags kopiert.
Rabe

2

Ich habe die folgende Methode verwendet, um meinen GIT-Stash nach GitLab zu migrieren, indem ich alle Zweige und den Commit-Verlauf verwaltet habe.

Klonen Sie das alte Repository auf lokal.

git clone --bare <STASH-URL>

Erstellen Sie ein leeres Repository in GitLab.

git push --mirror <GitLab-URL>

1

Es sieht so aus, als ob du nah dran bist. Angenommen, es ist nicht nur ein Tippfehler in Ihrer Einreichung, sollte Schritt 3 cd repo2anstelle von repo1 sein. Und Schritt 6 sollte git pullnicht drücken. Überarbeitete Liste:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

Vielen Dank an Eric, aber in Schritt 3 möchte ich den Link des ursprünglichen Repositorys entfernen, um keine Remote-Änderungen vorzunehmen. Ich möchte Inhalte von repo1 nach repo2 verschieben.
Mario

In Ordung. Ich habe meine Antwort bearbeitet, um dies widerzuspiegeln. Nur um sicherzugehen, dass Sie versuchen, ein Repository, repo2, zu erstellen, das eine Kopie von repo1 ist, aber weder repo1 noch origin als Fernbedienungen behält?
Eric Palace

Nein, ich versuche nicht, ein neues Repo "repo2" zu machen. Eigentlich habe ich ein bestehendes Repo2, das andere Inhalte init hat. Jetzt möchte ich den gesamten Inhalt von repo1 mit dem Verlauf in repo2 verschieben. Ich werde das repo1 leer halten, wie es auf dem Server ist.
Mario

Haben Sie darüber nachgedacht, Git nicht zu verwenden? Es scheint, als könnten Sie die Dateien wahrscheinlich einfach kopieren (über eine GUI oder scp oder ftp) und sie manuell zu Ihrem Git-Repo hinzufügen. Es ist vielleicht nicht so effizient, aber wahrscheinlich einfacher.
Eric Palace

Ich habe es bereits versucht, aber es hat die Geschichte verlassen. Ich möchte auch die ganze Geschichte verschieben.
Mario

1

Laut @ Dan-Cohn Antwort Mirror-Push ist dein Freund hier. Dies ist meine Aufgabe für die Migration von Repos:

Ein Repository spiegeln

1.Öffnen Sie Git Bash.

2.Erstellen Sie einen nackten Klon des Repositorys.

$ git clone --bare https://github.com/exampleuser/old-repository.git

3.Mirror-Push in das neue Repository.

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4.Entfernen Sie das temporäre lokale Repository, das Sie in Schritt 1 erstellt haben.

$ cd ..
$ rm -rf old-repository.git

Referenz und Gutschrift: https://help.github.com/de/articles/duplicating-a-repository


-1

Hier gibt es viele komplizierte Antworten; Wenn Sie sich jedoch nicht mit der Erhaltung von Zweigen befassen, müssen Sie lediglich den Remote-Ursprung zurücksetzen, den Upstream einstellen und pushen.

Dies hat dazu beigetragen, die gesamte Commit-Historie für mich zu bewahren.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.