GitHub: Come rendere privato un fork del repository pubblico?


247

Come posso fork un repository pubblico, ma rendere privato il mio fork? Ho l'abbonamento per supportare i repository privati.

Risposte:


394

Le risposte sono corrette ma non menzionate come sincronizzare il codice tra il repository pubblico e il fork.

Ecco il flusso di lavoro completo (lo abbiamo già fatto prima di open source React Native ):


Innanzitutto, duplica il repository come altri hanno detto (dettagli qui ):

Crea un nuovo repository (chiamiamolo così private-repo) tramite l' interfaccia utente di Github . Poi:

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

Clonare il repository privato in modo da poter lavorare su di esso:

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

Per estrarre nuovo entusiasmo dal repository pubblico:

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

Fantastico, il tuo repository privato ora ha l'ultimo codice del repository pubblico più le tue modifiche.


Infine, per creare un repository privato di richiesta pull -> repository pubblico:

Utilizzare l'interfaccia utente di GitHub per creare un fork del repository pubblico (il piccolo pulsante "Fork" in alto a destra nella pagina del repository pubblico). Poi:

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

Ora puoi creare una richiesta pull tramite l'interfaccia utente di Github per il repository pubblico, come descritto qui .

Una volta che i proprietari del progetto hanno esaminato la tua richiesta pull, possono unirla.

Naturalmente l'intero processo può essere ripetuto (basta tralasciare i passaggi in cui si aggiungono i telecomandi).


2
Perché non si può semplicemente aggiungere il repository privato vuoto come nuovo telecomando a un normale clone del repository pubblico e quindi spingere sul telecomando? Quale sarebbe la differenza?
Falko Menge,

@FalkoMenge Ho la stessa domanda. Leggendo git-scm.com/docs/git-clone , sembra che un normale git cloneimposti i rami di tracciamento remoto e forse qualche altra configurazione nel repository clonato che non vuoi davvero. Mentre un clone --bare copia semplicemente la directory .git dal telecomando così com'è.
bennlich,

1
Ciò spingerà anche la cronologia del commit privato nella filiale pubblica?
Sukhjinder Singh,

1
@Sukhjinder Singh Sì, l'ultimo passaggio spingerà la cronologia del commit privato nel repository pubblico. Se non lo desideri, puoi annullare i tuoi commit quando li unisci al repository pubblico e inviare un singolo commit con tutte le modifiche. Vedi ad esempio stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek

1
Devo fare un passo in cui clonare il mio repository privato e quindi apportare una modifica, quindi spingere. Qualsiasi modifica che ho apportato è passata inosservata a Git. git statusmostra tutto aggiornato, albero di lavoro pulito, indipendentemente da ciò che cambio. Di conseguenza non posso impegnarmi e spingere nulla. Ho eliminato il nuovo repository privato che ho effettuato altre 2 volte per tentare questo, ma ho continuato a riscontrare lo stesso problema. Eventuali suggerimenti?
Sarà il

92

C'è un'altra opzione ora (gennaio-2015)

  1. Crea un nuovo repository privato
  2. Nella schermata di repository vuota è presente un'opzione / pulsante "importa" inserisci qui la descrizione dell'immagine
  3. fai clic su di esso e inserisci l'URL repository github esistente Non viene menzionata alcuna opzione github ma funziona anche con i repository github. inserisci qui la descrizione dell'immagine
  4. FATTO

19
Funziona, anche se in modo leggermente diverso. (Ho provato ad agosto 2015). Non ho trovato l'opzione / pulsante di importazione, quindi ho cercato su Google e sono finito in questo URL. import.github.com/new Qui puoi inserire l'URL github esistente e fare clic sul pulsante Verifica . Una volta verificato, è possibile inserire il nome del nuovo repository e fare clic sul pulsante Privato, quindi fare clic su Inizia importazione
Shiva

2
Credo che @MattvanAndel significhi che il commento è corretto, non la risposta originale. Anch'io ho seguito il commento di Shiva e ha funzionato. Nota che NON devi prima creare il repository privato locale!
David H,

Se creo un "fork" privato in questo modo e voglio trasformarlo nuovamente in un fork pubblico, posso farlo?
Anders Lindén il

2
@ Shiva Sarò votato se dai una risposta al tuo commento.
Bebbi,

36

Le risposte attuali sono un po 'obsolete, quindi, per chiarezza:

La risposta breve è:

  1. Esegui un clone nudo del repository pubblico.
  2. Creane uno nuovo.
  3. Fai una spinta speculare al nuovo privato.

Questo è documentato su GitHub: duplicating-a-repository


4
C'è un modo per estrarre i cambiamenti a monte? Questo è importante per un repository che ha una licenza liberale: ho reso privato il mio repository ma vorrei ancora unire le modifiche a monte.
Amarprabhu,

2
Sì. Dovresti essere in grado di aggiungere l'altro repository come un nuovo (tracking) remoto (ad es. 'Other-repo') e quindi recuperare e unire periodicamente le modifiche da esso (ad es. 'Git merge other-repo / stable').
stefano,

26

Devi duplicare il repository

Puoi vedere questo documento (da github)

Per creare un duplicato di un repository senza biforcazione, è necessario eseguire uno speciale comando clone sul repository originale e fare il mirroring su quello nuovo.

Nei seguenti casi, il repository a cui stai tentando di eseguire il push - come exampleuser / new-repository o exampleuser / mirrorato - dovrebbe già esistere su GitHub. Vedere "Creazione di un nuovo repository" per ulteriori informazioni.

Mirroring di un repository

Per fare un duplicato esatto, devi eseguire sia un clone nudo che un push speculare.

Apri la riga di comando e digita questi comandi:

$ 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

Se si desidera eseguire il mirroring di un repository in un'altra posizione, incluso ottenere aggiornamenti dall'originale, è possibile clonare un mirror e inviare periodicamente le modifiche.

$ 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

Come con un clone nudo, un clone con mirroring include tutti i rami e i tag remoti, ma tutti i riferimenti locali verranno sovrascritti ogni volta che si recupera, quindi sarà sempre lo stesso del repository originale. L'impostazione dell'URL per i push semplifica il push sul mirror. Per aggiornare il tuo mirror, scarica gli aggiornamenti e invia, che potrebbero essere automatizzati eseguendo un processo cron.

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

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


Questo crea un clone del repository ma non crea un fork nel senso di GitHub. Quando si crea un fork effettivo in GitHub, viene visualizzato un testo "biforcato da esempioutente / repository-a-mirror" sotto il nome del fork. Mostra anche un albero di tutte le altre forcelle quando accedi a github.com/exampleuser/new-repository/network/members.
apaatsio,

20

GitHub ora ha un'opzione di importazione che ti consente di scegliere qualsiasi cosa tu voglia il tuo nuovo repository importato pubblico o privato

Importazione del repository Github


L'importazione è ancora in esecuzione su un repository di grandi dimensioni (5 giorni), il check-out è molto più veloce, ma forse si tratta di più passaggi per tenerlo aggiornato. La lentezza è comprensibile suppongo che importa tutto non solo il ramo principale, ma vorrei che fosse più veloce ...
Liam Mitchell

1
Stavo per aggiungere la stessa risposta, ma grazie per averlo fatto prima. Sono contento che Github Repos privati ​​gratuiti disponibili da gennaio dell'anno scorso. : D
OBL,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.