Como atualizo meu repo bare?

134

Criei um repositório simples para publicar meu repositório, mas não consigo descobrir como atualizar o repositório simples com o estado atual do repositório principal.

Šimon Tóth
fonte
2
Veja esta resposta: stackoverflow.com/questions/315911/…
Ken Bloom

Respostas:

83

Se você deseja duplicar todos os objetos do repositório principal, faça isso dentro do repositório principal:

git push --all <url-of-bare-repo>

Como alternativa, faça uma busca dentro do repositório vazio:

git fetch <url-of-main-repo>

Você não pode fazer um pull, porque um pull deseja mesclar com o HEADqual um repositório simples não possui.

Você pode adicioná-los como controles remotos para poupar algumas digitações no futuro:

git remote add <whatever-name> <url-of-other-repo>

Então você pode simplesmente fazer

git push --all <whatever-name>

ou

git fetch <whatever-name>

dependendo do repo em que você está. Se <whatever-name>for origin, você pode até deixar de fora.

Disclaimer: Eu não sou um git guru. Se eu dissesse algo errado, gostaria de ser esclarecido!

Atualização: Leia os comentários!

Thomas
fonte
7
Quando fiz um git-fetch --allinterior do repositório vazio, não vi as atualizações que fiz no repositório principal, mas ao empurrá-las do repositório principal, git push --all <url-of-bare-repo>vejo as atualizações em git log. Presumivelmente, há uma explicação simples para isso - alguém pode explicar?
Pho79 # 1/12
2
@ Thomas - Sim, por "não vi", quero dizer git log, não mostra essas atualizações no repo. (Nem git log --allum nem outro repositório de trabalho criado ao clonar o repositório simples - via git log --allou simplesmente olhando para novos arquivos que devem aparecer lá). É um teste bem rápido de se ver. Principalmente, estou apenas curioso sobre o que estou perdendo.
Pho79
71
Se o seu repo mais remoto for algo como o github, onde você não tem acesso, não pode executar push, etc., poderá fazê-lo git fetch -q origin master:masterdentro do seu repo simples. Isso irá buscar o novo material da ramificação principal do github e atualizar sua ramificação principal local.
Altreus
4
@Altreus De fato, master:masteré o necessário para avançar o HEAD para o repo remoto. No meu caso, por causa de um problema, não consegui mais me conectar ao nosso repositório simples porque o git estava ausente. Até que seja resolvido, faço um túnel reverso e busco o repositório central usando: git fetch ssh://localhost:8765/... master:mastere funciona como um encanto. Obrigado!
Estani
3
@Altreus Se você quiser todos os ramos, em seguida, você pode fazergit fetch origin *:*
JBert
71

Criei um repositório usando o seguinte comando

git clone --bare <remote_repo>

Depois, tentei atualizar o clone vazio usando a resposta de Thomas, mas não funcionou para mim. Para atualizar o repositório vazio (que é o que eu acho que o Let_Me_Be estava perguntando), tive que criar um repositório espelho:

git clone --mirror <remote_repo>

Em seguida, eu poderia executar o seguinte comando no repositório espelhado para obter as atualizações do repositório principal:

git fetch --all

Me deparei com essa solução lendo Mirror a Git Repository Pulling

austen
fonte
22
Para alterar um repo bare existente para espelhar, tudo o que você precisa fazer é adicionar 2 linhas ao arquivo de configuração do git em <REPO> .git / config. Na [remote "origin"]seção, adicione fetch = +refs/*:refs/*emirror = true
Isaac Betesh 30/08/13
@IsaacBetesh Você salvou meu dia :)
smc
54

A única solução além de recriar git clone --mirroré de Gregor :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

então você pode git fetche verá as atualizações. O estranho é que, antes disso, mesmo que haja um remoteconfigurado, ele não possui ramificações listadas git branch -a.

Colin D Bennett
fonte
1
Isso realmente me ajudou! O projeto / repositório Capistrano também usa essa configuração para permitir que uma linha git remote updatefaça o trabalho.
Minqi Pan
1
Se o controle remoto tiver ramificações atualizadas ou excluídas à força (e você desejar refletir essas alterações), pode ser necessário adicionar --forcee, --prunerespectivamente, à git fetchlinha.
Elliott Slaughter
46

Assumindo:

$ git clone --bare https://github.com/.../foo.git

Buscar com:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Nota: --git-dir=foo.gitnão é necessário se você cdacessar o diretório primeiro.

Antak
fonte
2
Embora eu não saiba quando isso ocorre, se originnão estiver definido, você sempre poderá substituir a originpeça pelo caminho / URL do seu repositório original. por exemplo$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak 21/01
Era exatamente isso que eu estava procurando. Isso funcionou perfeitamente.
Maxime Rouiller
13

Depois de muita bagunça, descobri que isso funciona para mim.

Uma vez:

git clone --mirror ssh://[email protected]:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Sempre que eu quero sincronizar:

cd /home/myhome/repo.git
git --bare fetch ssh://[email protected]:2000/repo
git  fetch ssh://[email protected]:2000/repo
git push --mirror remote_site
simonvc
fonte
7
A terceira linha ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') é a chave. Boa resposta, obrigado!
peterh - Restabelece Monica 27/03
2
Como @ Peterh disse, a linha git config remote.origin.fetch 'refs/heads/*:refs/heads/*'é a resposta. Depois de pressionar este comando, posso apenas git fetche o repo é sincronizado com o remoto.
Joker
3

Adicione o repositório vazio como um repositório remoto e use git push.

Philipp
fonte
Então, se eu quiser fazer isso sem pressionar, não posso usar um repositório vazio e usar um link simbólico ou algo assim?
Šimon Tóth
O envio é o método normal para transferir o conteúdo do repositório para um repositório simples, não há necessidade de evitá-lo.
Philipp
2
Você nem sempre pode empurrar. Por exemplo, se o nu está em uma rede privada, e os principais acordos de recompra é um público (no GitHub, por exemplo)
fanf42
0

Para mim, essa combinação funcionou:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

O parâmetro -u para busca era necessário, caso contrário, recebo a mensagem de erro: "Recusando buscar referências / cabeças / mestre de ramificações atuais do repositório não nu" (consulte também https://stackoverflow.com/a/19205680/4807875 )

Alexander Samoylov
fonte