GitHub: Wie mache ich eine Abzweigung des öffentlichen Repositorys privat?

247

Wie kann ich ein öffentliches Repository aufteilen, aber meine Abzweigung privat machen? Ich habe das Abonnement zur Unterstützung privater Repositorys.

zer0stimulus
quelle

Antworten:

393

Die Antworten sind korrekt, aber erwähnen Sie nicht, wie Code zwischen dem öffentlichen Repo und der Gabel synchronisiert wird.

Hier ist der vollständige Workflow (wir haben dies vor dem Open Sourcing von React Native durchgeführt ):


Dupliziere zuerst das Repo wie andere gesagt haben (Details hier ):

Erstellen Sie ein neues Repo (nennen wir es private-repo) über die Github-Benutzeroberfläche . Dann:

git clone --bare https://github.com/exampleuser/public-repo.git
cd public-repo.git
git push --mirror https://github.com/yourname/private-repo.git
cd ..
rm -rf public-repo.git

Klonen Sie das private Repo, damit Sie daran arbeiten können:

git clone https://github.com/yourname/private-repo.git
cd private-repo
make some changes
git commit
git push origin master

So holen Sie neue Schärfe aus dem öffentlichen Repo:

cd private-repo
git remote add public https://github.com/exampleuser/public-repo.git
git pull public master # Creates a merge commit
git push origin master

Genial, Ihr privates Repo enthält jetzt den neuesten Code aus dem öffentlichen Repo sowie Ihre Änderungen.


Zum Erstellen einer Pull-Anfrage Private Repo -> Public Repo:

Verwenden Sie die GitHub-Benutzeroberfläche, um eine Abzweigung des öffentlichen Repos zu erstellen (die kleine Schaltfläche "Abzweigung" oben rechts auf der öffentlichen Repo-Seite). Dann:

git clone https://github.com/yourname/the-fork.git
cd the-fork
git remote add private_repo_yourname https://github.com/yourname/private-repo.git
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

Jetzt können Sie über die Github-Benutzeroberfläche eine Pull-Anfrage für Public-Repo erstellen, wie hier beschrieben .

Sobald die Projektbesitzer Ihre Pull-Anfrage überprüft haben, können sie sie zusammenführen.

Natürlich kann der gesamte Vorgang wiederholt werden (lassen Sie einfach die Schritte weg, in denen Sie Fernbedienungen hinzufügen).

Martin Konicek
quelle
2
Warum kann man das leere private Repo nicht einfach als neue Fernbedienung zu einem normalen Klon des öffentlichen Repos hinzufügen und dann auf die Fernbedienung verschieben? Was wäre der Unterschied?
Falko Menge
@FalkoMenge Ich habe die gleiche Frage. Wenn Sie git-scm.com/docs/git-clone lesen , klingt es so, als würde ein Normaler git cloneRemote-Tracking-Zweige und möglicherweise eine andere Konfiguration im geklonten Repo einrichten, die Sie nicht wirklich wollen. Während ein --bare Klon das .git-Verzeichnis so wie es ist von der Fernbedienung kopiert.
Bennlich
1
Wird dies auch die private Commit-Historie auf die öffentliche Niederlassung übertragen?
Sukhjinder Singh
1
@Sukhjinder Singh Ja, der letzte Schritt wird die private Commit-Historie auf das öffentliche Repo übertragen. Wenn Sie das nicht möchten, können Sie Ihre Commits beim Zusammenführen mit dem öffentlichen Repo quetschen und ein einziges Commit mit all Ihren Änderungen verschieben. Siehe z. B. stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek
1
Ich muss gehen, wo ich mein privates Repo klone und dann eine Änderung vornehmen und dann pushen. Alle Änderungen, die ich vorgenommen habe, sind von git unbemerkt geblieben. git statuszeigt alles auf dem neuesten Stand, Arbeitsbaum sauber, egal was ich ändere. Folglich kann ich nichts festlegen und pushen. Ich habe das neue private Repo gelöscht, das ich noch zweimal erstellt habe, um dies zu versuchen, bin aber immer wieder auf dasselbe Problem gestoßen. Irgendwelche Vorschläge?
Will
92

Es gibt jetzt eine weitere Option (Januar 2015)

  1. Erstellen Sie ein neues privates Repo
  2. Auf dem leeren Repo-Bildschirm befindet sich eine Option / Schaltfläche "Importieren" Geben Sie hier die Bildbeschreibung ein
  3. Klicken Sie darauf und fügen Sie die vorhandene Github-Repo-URL ein. Es wird keine Github-Option erwähnt, aber es funktioniert auch mit Github-Repos. Geben Sie hier die Bildbeschreibung ein
  4. GETAN
Szydan
quelle
19
Das funktioniert, wenn auch etwas anders. (Ich habe es im August 2015 versucht). Ich habe die Importoption / -schaltfläche nicht gefunden, habe sie also gegoogelt und bin in dieser URL gelandet. import.github.com/new Hier können Sie die vorhandene Github-URL eingeben und auf die Schaltfläche Check it klicken . Nach der Überprüfung können Sie den Namen Ihres neuen Repos eingeben und auf die Schaltfläche Privat klicken. Klicken Sie dann auf Import beginnen
Shiva
2
Ich glaube, @MattvanAndel bedeutet, dass der Kommentar korrekt ist, nicht die ursprüngliche Antwort. Auch ich folgte Shivas Kommentar und es funktionierte. Beachten Sie, dass Sie NICHT zuerst das lokale private Repository erstellen sollten!
David H
Kann ich das tun, wenn ich auf diese Weise eine private "Gabelung" erstelle und sie wieder zu einer öffentlichen Gabelung machen möchte?
Anders Lindén
2
@Shiva Ich werde positiv stimmen, wenn Sie aus Ihrem Kommentar eine Antwort machen.
Bebbi
36

Die aktuellen Antworten sind aus Gründen der Übersichtlichkeit etwas veraltet:

Die kurze Antwort lautet:

  1. Machen Sie einen nackten Klon des öffentlichen Repos.
  2. Erstellen Sie eine neue private.
  3. Machen Sie einen Spiegeldruck auf den neuen privaten.

Dies ist auf GitHub dokumentiert: Duplizieren eines Repositorys

stefano
quelle
4
Gibt es eine Möglichkeit, vorgelagerte Änderungen vorzunehmen? Dies ist wichtig für ein Repo mit einer liberalen Lizenz. Ich habe mein Repo privat gemacht, möchte aber dennoch die vorgelagerten Änderungen zusammenführen.
Amarprabhu
2
Ja. Sie sollten in der Lage sein, das andere Repo als neue (Tracking-) Fernbedienung hinzuzufügen (z. B. "anderes Repo") und dann regelmäßig Änderungen daraus abzurufen und zusammenzuführen (z. B. "git anderes Repo / stabil zusammenführen").
Stefano
26

Sie müssen das Repo duplizieren

Sie können dieses Dokument sehen (von Github)

Um ein Duplikat eines Repositorys ohne Verzweigung zu erstellen, müssen Sie einen speziellen Klonbefehl für das ursprüngliche Repository ausführen und auf das neue Repository spiegeln.

In den folgenden Fällen sollte das Repository, in das Sie pushen möchten - wie exampleuser / new-repository oder exampleuser / Mirrored - bereits auf GitHub vorhanden sein. Weitere Informationen finden Sie unter "Erstellen eines neuen Repositorys".

Ein Repository spiegeln

Um ein genaues Duplikat zu erstellen, müssen Sie sowohl einen Bare-Clone- als auch einen Mirror-Push ausführen.

Öffnen Sie die Befehlszeile und geben Sie die folgenden Befehle ein:

$ git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

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

$ cd ..
$ rm -rf old-repository.git
# Remove our temporary local repository

Wenn Sie ein Repository an einem anderen Speicherort spiegeln möchten, einschließlich Aktualisierungen vom Original, können Sie einen Spiegel klonen und die Änderungen regelmäßig übertragen.

$ git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository

$ cd repository-to-mirror.git
$ git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror

Wie bei einem nackten Klon enthält ein gespiegelter Klon alle Remote-Zweige und -Tags, aber alle lokalen Referenzen werden bei jedem Abruf überschrieben, sodass er immer mit dem ursprünglichen Repository identisch ist. Das Festlegen der URL für Pushs vereinfacht das Pushing auf Ihren Spiegel. Um Ihren Spiegel zu aktualisieren, rufen Sie Aktualisierungen und Push ab, die durch Ausführen eines Cron-Jobs automatisiert werden können.

$ git fetch -p origin
$ git push --mirror

https://help.github.com/articles/duplicating-a-repository

bsuttor
quelle
Dies erstellt einen Klon des Repos, aber keine Gabel im GitHub-Sinne. Wenn Sie eine tatsächliche Verzweigung in GitHub erstellen, wird unter dem Verzweigungsnamen ein Text angezeigt, der "vom Beispielbenutzer / Repository zum Spiegel gegabelt" wurde. Außerdem wird ein Baum aller anderen Gabeln angezeigt, wenn Sie zu github.com/exampleuser/new-repository/network/members navigieren.
Apaatsio
20

GitHub verfügt jetzt über eine Importoption, mit der Sie auswählen können, was Ihr neues importiertes Repository öffentlich oder privat sein soll

Github Repository Import

Yidir
quelle
Der Import wird immer noch in einem großen Repository ausgeführt (5 Tage). Das Auschecken ist viel schneller, aber möglicherweise sind dies mehr Schritte, um es auf dem neuesten Stand zu halten. Die Langsamkeit ist wohl verständlich, da sie alles importiert, nicht nur den Hauptzweig, sondern ich wünschte, es wäre schneller ...
Liam Mitchell
1
Ich wollte die gleiche Antwort hinzufügen, aber danke, dass Sie es zuerst getan haben. Ich bin froh, dass Github Free private Repos seit Januar letzten Jahres verfügbar sind. : D
OBL