GitHub: Como tornar um fork do repositório público privado?

247

Como posso bifurcar um repositório público, mas tornar meu bifurcação privado? Eu tenho a assinatura para dar suporte a repositórios particulares.

zer0stimulus
fonte

Respostas:

394

As respostas estão corretas, mas não mencionam como sincronizar o código entre o repositório público e o fork.

Aqui está o fluxo de trabalho completo (fizemos isso antes do código aberto React Native ):


Primeiro, duplique o repositório como outros disseram (detalhes aqui ):

Crie um novo repositório (vamos chamá-lo private-repo) através da interface do usuário do Github . Então:

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

Clone o repositório particular para poder trabalhar nele:

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

Para obter novos gostos do repositório público:

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

Impressionante, seu repositório particular agora tem o código mais recente do repositório público e suas alterações.


Por fim, para criar um repositório privado de solicitação pull -> public repo:

Use a interface do usuário do GitHub para criar uma bifurcação do repositório público (o pequeno botão "Fork" no canto superior direito da página do repositório público). Então:

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

Agora você pode criar uma solicitação de recebimento via interface do usuário do Github para repositório público, conforme descrito aqui .

Depois que os proprietários do projeto analisam sua solicitação de recebimento, eles podem mesclá-la.

É claro que todo o processo pode ser repetido (deixe de fora as etapas em que você adiciona controles remotos).

Martin Konicek
fonte
2
Por que não se pode simplesmente adicionar o repositório privado vazio como um novo controle remoto a um clone normal do repositório público e depois empurrá-lo para o controle remoto? Qual seria a diferença?
Falko Menge
@FalkoMenge Eu tenho a mesma pergunta. Lendo git-scm.com/docs/git-clone , parece normal git cloneconfigurar ramificações de rastreamento remoto e talvez alguma outra configuração no repositório clonado que você realmente não deseja. Enquanto um clone --bare apenas copia o diretório .git do controle remoto como está.
bennlich
1
Isso também levará o privado a comprometer a história para o ramo público?
Sukhjinder Singh
1
@Sukhjinder Singh Sim, o último passo empurrará o histórico de confirmação privada para o repositório público. Se você não quiser isso, poderá esmagar seus commits ao mesclá-los ao repositório público e enviar um único commit com todas as suas alterações. Veja, por exemplo, stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek
1
Eu cheguei ao ponto de clonar meu repositório particular e, em seguida, fazer uma alteração e pressionar. Quaisquer alterações que eu fiz passaram despercebidas pelo git. git statusmostra tudo atualizado, a árvore de trabalho limpa, não importa o que eu mude. Consequentemente, não posso comprometer e pressionar nada. Excluí o novo repositório particular que fiz mais duas vezes para tentar isso, mas continuei com esse mesmo problema. Alguma sugestão?
Will
92

Há mais uma opção agora (janeiro-2015)

  1. Crie um novo repo privado
  2. Na tela do repositório vazio, há uma opção / botão "importar" insira a descrição da imagem aqui
  3. clique nele e coloque o URL do repositório Github existente. Não há menção à opção github, mas ele também funciona com repositórios do Github. insira a descrição da imagem aqui
  4. FEITO
szydan
fonte
19
Isso funciona, embora um pouco diferente. (Tentei em agosto de 2015). Não encontrei a opção / botão de importação, então procurei no Google e acabei neste URL. import.github.com/new Aqui, você pode inserir o URL do github existente e clicar no botão Verificar . Uma vez verificado, você pode digitar o nome do seu novo repo e clique no botão Privada e clique em Iniciar importação
Shiva
2
Acredito que @MattvanAndel significa que o comentário está correto, não a resposta original. Eu também segui o comentário de Shiva e funcionou. Observe que você NÃO deve criar o repositório privado local primeiro!
David H
Se eu criar um "garfo" privado dessa maneira e quiser torná-lo um garfo público novamente, posso fazer isso?
Anders Lindén
2
@Shiva Vou votar se você responder do seu comentário.
Bebbi
36

As respostas atuais estão um pouco desatualizadas, portanto, para maior clareza:

A resposta curta é:

  1. Faça um clone do repositório público.
  2. Crie um novo particular.
  3. Faça um push de espelho para o novo privado.

Isso está documentado no GitHub: duplicando um repositório

Stefano
fonte
4
Existe uma maneira de puxar mudanças a montante? Isso é importante para um repo que possui uma licença liberal - tornei meu repo privado, mas ainda gostaria de mesclar as alterações anteriores.
Amarprabhu 28/05
2
Sim. Você deve poder adicionar o outro repositório como um novo controle remoto (por exemplo, 'other-repo') e, periodicamente, buscar e mesclar alterações nele (por exemplo, 'git merge other-repo / stable').
31514 stefano
26

Você precisa duplicar o repositório

Você pode ver este documento (no github)

Para criar uma duplicata de um repositório sem bifurcar-se, você precisa executar um comando clone especial no repositório original e enviar push para o novo.

Nos casos a seguir, o repositório para o qual você está tentando enviar - como exampleuser / new-repository ou exampleuser / mirrored - já deve existir no GitHub. Consulte "Criando um Novo Repositório" para obter mais informações.

Espelhando um Repositório

Para criar uma duplicata exata, é necessário executar um clone nu e um push de espelho.

Abra a linha de comandos e digite estes comandos:

$ 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 desejar espelhar um repositório em outro local, incluindo a obtenção de atualizações do original, você pode clonar um espelho e enviar periodicamente as alterações.

$ 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

Como em um clone simples, um clone espelhado inclui todas as ramificações e tags remotas, mas todas as referências locais serão substituídas toda vez que você buscar, portanto, sempre será o mesmo que o repositório original. Definir o URL para pushes simplifica o envio ao seu espelho. Para atualizar seu espelho, busque atualizações e envio por push, que pode ser automatizado executando uma tarefa cron.

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

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

bsuttor
fonte
Isso cria um clone do repositório, mas não cria uma bifurcação no sentido do GitHub. Quando você cria um fork real no GitHub, ele mostra um texto "bifurcado do exemplo exampleuser / repository-to-mirror" sob o nome do fork. Ele também mostra uma árvore de todos os outros garfos quando você navega para github.com/exampleuser/new-repository/network/members.
Apaatsio 11/04/19
20

Agora o GitHub tem uma opção de importação que permite escolher o que você quer que seu novo repositório importado seja público ou privado.

Importação de repositório do Github

Yidir
fonte
A importação ainda está sendo executada em um repositório grande (5 dias), verificá-los é muito mais rápido, mas talvez sejam mais etapas para mantê-lo atualizado. A lentidão é compreensível, suponho que ela importe tudo, não apenas o ramo principal, mas eu gostaria que fosse mais rápido ...
Liam Mitchell
1
Eu adicionaria a mesma resposta, mas obrigado por fazê-lo primeiro. Fico feliz que os repositórios privados do Github Free estejam disponíveis desde janeiro do ano passado. : D
OBL