GitHub: Jak uczynić widelec publicznego repozytorium prywatnym?

247

Jak mogę rozwidlić publiczne repozytorium, ale ustawić prywatny widelec? Mam abonament na obsługę prywatnych repozytoriów.

zer0stimulus
źródło

Odpowiedzi:

394

Odpowiedzi są poprawne, ale nie wspominają o synchronizacji kodu między publicznym repozytorium a rozwidleniem.

Oto pełny obieg pracy (zrobiliśmy to przed otwartymi źródłami React Native ):


Najpierw zduplikuj repozytorium, jak powiedzieli inni (szczegóły tutaj ):

Utwórz nowe repozytorium (nazwijmy to private-repo) za pomocą interfejsu użytkownika Github . Następnie:

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

Sklonuj prywatne repozytorium, aby móc nad nim pracować:

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

Aby pobrać nową popularność z publicznego repozytorium:

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

Niesamowite, twoje prywatne repozytorium ma teraz najnowszy kod z repozytorium publicznego oraz twoje zmiany.


Wreszcie, aby utworzyć żądanie ściągania prywatne repo -> repo publiczne:

Użyj interfejsu GitHub, aby utworzyć rozwidlenie publicznego repozytorium (mały przycisk „Widelec” w prawym górnym rogu strony publicznego repozytorium). Następnie:

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

Teraz możesz utworzyć żądanie ściągnięcia za pomocą interfejsu Github dla publicznego repo, jak opisano tutaj .

Gdy właściciele projektu sprawdzą twoje żądanie ściągnięcia, mogą je scalić.

Oczywiście cały proces można powtórzyć (pomiń kroki, w których dodajesz piloty).

Martin Konicek
źródło
2
Dlaczego nie można po prostu dodać pustego prywatnego repozytorium jako nowego pilota do normalnego klonu publicznego repozytorium, a następnie wcisnąć go do pilota? Jaka byłaby różnica?
Falko Menge,
@FalkoMenge Mam to samo pytanie. Czytając git-scm.com/docs/git-clone , brzmi to tak, jakby normalny git cloneskonfigurował zdalne gałęzie śledzenia i może inną konfigurację w klonowanym repozytorium, której tak naprawdę nie chcesz. Podczas gdy klon --bare po prostu kopiuje .git dir z pilota tak jak jest.
bennlich,
1
Czy to również popchnie historię prywatnych zatwierdzeń do oddziału publicznego?
Sukhjinder Singh,
1
@Sukhjinder Singh Tak, ostatni krok popchnie historię prywatnych zatwierdzeń do publicznego repozytorium. Jeśli tego nie chcesz, możesz zmiażdżyć swoje zobowiązania podczas łączenia ich z publicznym repozytorium i wcisnąć jeden zatwierdzenie ze wszystkimi zmianami. Patrz np. Stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek
1
Muszę zrobić krok, aby sklonować moje prywatne repozytorium, a następnie dokonać zmiany, a następnie pchnąć. Wszelkie wprowadzone zmiany pozostały niezauważone przez git. git statuspokazuje wszystko na bieżąco, działające drzewo czyste bez względu na to, co zmienię. W związku z tym nie mogę niczego zatwierdzać i naciskać. Usunąłem nowe prywatne repozytorium, które zrobiłem jeszcze 2 razy, aby spróbować, ale wciąż napotykałem ten sam problem. Jakieś sugestie?
Czy
92

Teraz jest jeszcze jedna opcja (styczeń 2015)

  1. Utwórz nowe prywatne repozytorium
  2. Na pustym ekranie repozytorium znajduje się opcja / przycisk „importuj” wprowadź opis zdjęcia tutaj
  3. kliknij i umieść istniejący adres URL repozytorium github Nie ma wzmianki o opcji github, ale działa również z repozytoriami github. wprowadź opis zdjęcia tutaj
  4. GOTOWE
szydan
źródło
19
Działa to, choć trochę inaczej. (Próbowałem w sierpniu 2015 r.). Nie znalazłem opcji / przycisku importowania, więc przejrzałem go i znalazłem w tym adresie URL. import.github.com/new Tutaj możesz wprowadzić istniejący adres URL github i kliknąć przycisk Sprawdź . Po zweryfikowaniu możesz wprowadzić nazwę nowego repozytorium i kliknąć przycisk Prywatny, a następnie kliknąć Rozpocznij import
Shiva
2
Uważam, że @MattvanAndel oznacza, że ​​komentarz jest poprawny, a nie oryginalna odpowiedź. Ja również podążyłem za komentarzem Shivy i zadziałało. Pamiętaj, że NIE powinieneś najpierw tworzyć lokalnego prywatnego repozytorium!
David H
Jeśli utworzę w ten sposób prywatny „widelec” i chcę ponownie uczynić go publicznym widelcem, czy mogę to zrobić?
Anders Lindén,
2
@Shiva Będę głosować, jeśli udzielisz odpowiedzi na podstawie komentarza.
bebbi
36

Obecne odpowiedzi są nieco nieaktualne, więc dla jasności:

Krótka odpowiedź brzmi:

  1. Wykonaj czysty klon publicznego repozytorium.
  2. Utwórz nowy prywatny.
  3. Wykonaj lustrzane odbicie w nowym prywatnym.

Jest to udokumentowane w GitHub: repozytorium-repozytorium

Stefan
źródło
4
Czy istnieje sposób na wprowadzenie zmian w górę łańcucha? Jest to ważne w przypadku repozytorium, które ma liberalną licencję - ustawiłem moje repozytorium jako prywatne, ale nadal chciałbym scalić wcześniejsze zmiany.
amarprabhu
2
Tak. Powinieneś być w stanie dodać inne repozytorium jako nowy pilot (śledzący) (np. „Other-repo”), a następnie okresowo pobierać i scalać z niego zmiany (np. „Git merge other-repo / stable”).
stefano
26

Musisz zduplikować repozytorium

Możesz zobaczyć ten dokument (z github)

Aby utworzyć duplikat repozytorium bez rozwidlenia, musisz uruchomić specjalne polecenie klonowania w stosunku do oryginalnego repozytorium i przesłać lustro do nowego.

W następujących przypadkach repozytorium, do którego próbujesz wypchnąć - jak exampleuser / new-repository lub exampleuser / mirror - powinno już istnieć na GitHub. Aby uzyskać więcej informacji, zobacz „Tworzenie nowego repozytorium”.

Mirroring repozytorium

Aby wykonać dokładny duplikat, musisz wykonać zarówno nagi klon, jak i odbicie lustrzane.

Otwórz wiersz poleceń i wpisz następujące polecenia:

$ 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

Jeśli chcesz wykonać kopię lustrzaną repozytorium w innej lokalizacji, w tym pobrać aktualizacje z oryginału, możesz sklonować kopię lustrzaną i okresowo wprowadzać zmiany.

$ 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

Podobnie jak w przypadku samego klonu, klon lustrzany zawiera wszystkie zdalne gałęzie i znaczniki, ale wszystkie lokalne odniesienia będą nadpisywane przy każdym pobieraniu, więc zawsze będzie takie samo jak oryginalne repozytorium. Ustawienie adresu URL dla wypychań ułatwia wypychanie do lustra. Aby zaktualizować serwer lustrzany, pobierz aktualizacje i wypchnij, które można zautomatyzować, uruchamiając zadanie CRON.

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

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

bsuttor
źródło
Tworzy to klon repozytorium, ale nie tworzy rozwidlenia w sensie GitHub. Podczas tworzenia rzeczywistego rozwidlenia w GitHub pod nazwą rozwidlenia wyświetla się tekst „rozwidlony z exampleuser / repository-to-mirror”. Pokazuje także drzewo wszystkich innych widelców podczas nawigacji na github.com/exampleuser/new-repository/network/members.
apaatsio
20

GitHub ma teraz opcję importu, która pozwala wybrać, co chcesz, aby nowe importowane repozytorium było publiczne lub prywatne

Import z repozytorium Github

Jidir
źródło
Import nadal działa w dużym repozytorium (5 dni), sprawdzanie go jest znacznie szybsze, ale może to więcej kroków, aby go aktualizować. Powolność jest zrozumiała, jak sądzę, ponieważ importuje wszystko nie tylko gałąź master, ale chciałbym, aby była szybsza ...
Liam Mitchell
1
Chciałem dodać tę samą odpowiedź, ale najpierw dziękuję. Cieszę się, że prywatne repozytoria Github dostępne są od stycznia ubiegłego roku. : D
OBL