Por que não consigo enviar para este repositório vazio?

283

Você pode explicar o que há de errado com esse fluxo de trabalho?

$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'

Nem git pushsempre é enviado para o repositório do qual clonei?

ripper234
fonte
Você não deve especificar um ramo a ser enviado?
Rekin
3
não depois de um clone !!! depois que o problema é corrigido, ele funciona muito bem e não é necessário especificar a ramificação ... apenas neste primeiro check-out de um repositório vazio, isso ocorre MUITO MUITO irritante ... eles devem corrigir esse problema.
Re: Hiller
Espero que este post seja útil para alguém ao tentar fazer o procedimento acima- samranga.blogspot.com/2015/07/… O erro na pergunta pode ser exibido mesmo quando se tenta criar um repositório git BitBucket a partir de um projeto já existente localmente
Samitha Chathuranga

Respostas:

483

Sim, o problema é que não há confirmações em "bare". Este é um problema apenas com o primeiro commit, se você criar os repositórios na ordem (bare, alice). Tente fazer:

git push --set-upstream origin master

Isso seria necessário apenas na primeira vez. Depois deve funcionar normalmente.

Como Chris Johnsen apontou, você não teria esse problema se o seu push.default fosse personalizado. Eu gosto de upstream / rastreamento.

Seth Robertson
fonte
1
Estou fazendo sudo apt-get upgrade git-coree sudo apt-get upgrade gitacho que nenhuma atualização é necessária. git --versionretorna 1.7.3.1. Alguma idéia do que está faltando? Admito que atualmente apt-get updatenão funciona para mim, mas isso não aconteceu há muito tempo.
Ripper234
1
@ ripper234: A versão atual do git é 1.7.5.3 Você pode conviver com a inconveniência, usar um fluxo de trabalho diferente ou instalar o git mais recente manualmente, sem o pacote debian / ubuntu.
Seth Robertson
Ah, claro, esqueço que o software leva algum tempo antes de ser empacotado. Eu sou um linux noob, vindo do Windows, e costumava clicar aqui para instalar a versão mais recente.
Ripper234 27/05
9
Em relação à “Versão recente não tem esse problema”: Mesmo em versões recentes, o padrão para pushes não parece ter mudado matching; talvez você tenha push.defaultdefinido como upstream/ tracking(ou current) no seu ~/.gitconfig?
Chris Johnsen
4
Tente git push origin master:masterexplicitar. Se isso não funcionar, verifique em qual filial você está: git branchtalvez você não tenha feito o primeiro commit ou o tenha feito em um branch que não seja o master.
Seth Robertson
43

Se vocês:

 git push origin master

ele será enviado ao repositório simples.

Parece que seu repo Alice não está rastreando corretamente.

cat .git/config

Isso mostrará o controle remoto e a ramificação padrão.

Se vocês

 git push -u origin master

Você deve começar a rastrear esse controle remoto e ramificação. Não tenho certeza se essa opção sempre esteve no git.

serby
fonte
30

A resposta desta pergunta relacionada forneceu a solução para mim ... foi apenas um erro estúpido:

Lembre-se de se comprometer primeiro!

https://stackoverflow.com/a/7572252

Se você ainda não se comprometeu com seu repo local, não há nada a oferecer, mas a mensagem de erro Git que você recebe não ajuda muito.

phpguru
fonte
17
git push --all

é a maneira canônica de enviar tudo para um novo repositório vazio.

Outra maneira de fazer a mesma coisa é criar seu novo repositório não-nu e criar um clone vazio com

git clone --bare

então use

git remote add origin <new-remote-repo>

no repositório original (não bare).

ebneter
fonte
... então você votou negativamente na resposta? Ele é a maneira padrão de empurrar tudo para um novo repositório, nua. Se não funcionou para você, há algum outro problema.
Ebneter 28/05
Você está certo, eu provavelmente não deveria ter, eu sei que você estava apenas tentando ajudar. Se você editá-lo, desfarei meu voto negativo.
Ripper234 28/05
Obrigado, editei-o com outra maneira de realizar a mesma tarefa.
ebneter 29/05
Sua resposta me ajudou a agradecer;) Mas no final do comando, o caminho deve estar presente assim: git push --all ../test_repoa URL do
repositório
@ Metafaniel Isso depende de como você o configura. Se o seu repositório local já tiver o controle remoto configurado corretamente, "git push --all" deve funcionar como está.
Ebneter 29/08/12
7

Tente isso em seu alicerepositório (antes de pressionar):

git config push.default tracking

Ou configure-o como o padrão para o seu usuário git config --global ….


git pushusa como padrão o originrepositório (que normalmente é o repositório do qual você clonou o repositório atual), mas não usa como padrão o envio da ramificação atual - o padrão é enviar apenas as ramificações existentes no repositório de origem e no repositório de destino.

A push.defaultvariável de configuração (consulte git-config (1) ) controla o que git pushserá enviado quando não houver argumentos "refspec" (isto é, algo após o nome de um repositório). O valor padrão fornece o comportamento descrito acima.

Aqui estão os valores possíveis para push.default:

  • nothing
    Isso força você a fornecer um "refspec".

  • matching(o padrão)
    Isso empurra todas as ramificações que existem no repositório de origem e no repositório de destino.
    Isso é completamente independente da ramificação que está atualmente com check-out.

  • upstreamou tracking
    (Ambos os valores significam a mesma coisa. O último foi descontinuado para evitar confusão com as ramificações de "rastreamento remoto". O primeiro foi introduzido no 1.7.4.2, portanto você precisará usá-lo se estiver usando o Git 1.7.3.1. )
    Eles enviam a ramificação atual para a ramificação especificada por sua configuração "upstream".

  • current
    Isso envia a ramificação atual para a ramificação com o mesmo nome no repositório de destino.

    Esses dois últimos acabam sendo os mesmos para casos comuns (por exemplo, trabalhando no mestre local que usa origem / mestre como upstream), mas são diferentes quando a ramificação local tem um nome diferente de sua ramificação "upstream":

    git checkout master
    # hack, commit, hack, commit
    
    # bug report comes in, we want a fix on master without the above commits
    
    git checkout -b quickfix origin/master  # "upstream" is master on origin
    # fix, commit
    git push
    

    Com push.defaultigual a upstream(ou tracking), o push iria para origino ramo principal de . Quando é igual a current, o push iria para origina ramificação do quickfix .

A matchingconfiguração atualizará bareo mestre do seu cenário, uma vez estabelecido. Para estabelecê-lo, você pode usar git push origin masteruma vez.

No entanto, a upstreamconfiguração (ou talvez current) parece ser uma correspondência melhor para o que você espera que aconteça; portanto, tente:

# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push

# configure it for only this repository
git config push.default upstream

# configure it for all repositories that do not override it themselves
git config --global push.default upstream

(Novamente, se você ainda estiver usando um Git antes da 1.7.4.2, precisará usar em trackingvez de upstream).

Chris Johnsen
fonte
1

Eu uso o cliente git SourceTree e vejo que o comando commit / push inicial é:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
IgorGanapolsky
fonte