So erstellen Sie ein neues Git-Repository aus einem vorhandenen

75

Ich habe ein Remote-Git-Repository, das wirklich alles ersetzt, was wir in einem anderen älteren SCM hatten. Im Laufe der Jahre wurden dem Repository viele Projekte und Produkte hinzugefügt.

In diesem Repo gibt es eine Filiale, die einem Produkt entspricht, an dem ich interessiert bin. Ich möchte nur aus dieser Filiale ein brandneues Git-Repository erstellen, das sich nicht wirklich um den Verlust der Geschichte kümmert.

Ist Git Remote die Lösung? Ich möchte, dass sich beide Repositorys auf demselben Server befinden.

Gedanken?

reza
quelle

Antworten:

78

Um ein neues Git-Repository aus einem vorhandenen Repository zu erstellen, wird normalerweise ein neues nacktes Repository erstellt und ein oder mehrere Zweige vom vorhandenen in das neue Repository verschoben.

Die folgenden Schritte veranschaulichen dies:

  1. Erstellen Sie ein neues Repository. Es muss kahl sein , damit Sie darauf drängen können.

    $ mkdir /path/to/new_repo
    $ cd /path/to/new_repo
    $ git --bare init

    Hinweis : Stellen Sie sicher, dass auf Ihr neues Repository über das vorhandene Repository zugegriffen werden kann. Es gibt viele Möglichkeiten, dies zu tun. Nehmen wir an, Sie haben es über zugänglich gemacht ssh://my_host/new_repo.

  2. Verschieben Sie einen Zweig aus Ihrem vorhandenen Repository. Angenommen, wir möchten den Zweig topic1aus dem vorhandenen Repository verschieben und ihn masterim neuen Repository benennen .

    $ cd /path/to/existing_repo
    $ git push ssh://my_host/new_repo +topic1:master

Mit dieser Technik können Sie den Verlauf des vorhandenen Zweigs beibehalten.

Hinweis: Das neue Repository ist effektiv ein neues Remote- Repository. Wenn Sie mit dem neuen Repository arbeiten möchten, müssen Sie es klonen. Folgendes klont das neue Repo in ein lokales Arbeitsverzeichnis mit dem Namen new_repo:

$ git clone ssh://my_host/new_repo

In diesem Beispiel sehen Sie beim Klonen des neuen Repositorys, dass der masterZweig eine Kopie des topic1Zweigs des alten Repositorys ist.

Pestrella
quelle
10
Wenn Sie regelmäßig zum Remote-Repo wechseln, ist dies wahrscheinlich ein guter Rat git remote add origin ssh://my_host/new_repo. Auf diese Weise machst du einfach eine git push origin [branchname]. Wenn Sie UNC-Dateipfade verwenden (z. B. für Windows-Freigaben), geben Sie den Remote-Ursprung für diese wie git remote add origin "//server_name/myapp/"
folgt ein
Kann auf das neue Repository als lokales Verzeichnis / Repository zugegriffen werden? Gibt es dafür Update-Methoden?
Nikos Alexandris
@NikosAlexandris Ich habe neue Informationen hinzugefügt, hoffe es hilft. Beachten Sie auch, dass es keine Rolle spielt, dass sich das neue Repo auf einem Remote-Server befindet. Im Beispiel pushen und klonen wir mithilfe des sshProtokolls. Wir hätten aber auch das fileProtokoll verwenden können, mit dem das neue Repository auf demselben Dateisystem erstellt worden wäre.
Pestrella
21

Ziehen Sie den Zweig wie gewohnt herunter und verschieben Sie ihn dann in ein neues Repository, das Sie mit erstellt haben git init. Sie würden Code verwenden, der ungefähr so ​​aussieht:

git push url:///new/repo.git TheBranchFolder

Diese Methode behält auch alle Ihre vorherigen Änderungen bei, wenn dies ein Plus für die Situation ist.

JustinDoesWork
quelle
Ich verwende den SSH-Zugriff auf mein Repo. Kann ich diesen anstelle der URL in Ihrer Antwort verwenden?
Reza
reza: ja, stellen Sie sich die ssh-URL nur als eine andere Art von URL vor.
Amcnabb
Auf dem Git-Server habe ich also git push / home / git / newBranchGIT-Filialname ausgegeben. Jetzt sehe ich ein Git-Repo, das alles enthält, was ich brauche, aber der einzige Zweig heißt jetzt Filialname und nicht Ursprung oder Master. Ich möchte, dass der Filialname Master ist. Oder gibt es einen besseren Weg, dies zu tun?
Reza
Ändern Sie einfach den Namen nach Ihren Wünschen und legen Sie fest.
JustinDoesWork
21

Wenn Sie nicht befürchten, den Verlauf zu verlieren, führen Sie a aus git checkout mybranchund kopieren Sie den Verzeichnisinhalt in einen anderen Ordner. Löschen Sie in diesem Ordner den Ordner .git und dann:

git init; git commit -a -m "Imported from project Y"
Justin ᚅᚔᚈᚄᚒᚔ
quelle
2
Wird dadurch die Commit-Historie des ursprünglichen Repos beibehalten?
Mike Graf
18
@ MikeGraf: Nein, wie im ersten Teil des ersten Satzes in der Antwort ausgeführt: "Wenn Sie nicht besorgt sind, die Geschichte zu verlieren ..."
Justin 30
2
Möglicherweise müssen Sie auch .gitignore entfernen / bearbeiten, da sonst der obige Befehl während des Festschreibens möglicherweise wichtige Dateien zurücklässt.
Dave