Por que o git push gerrit HEAD: refs / for / master é usado em vez do git push origin master


148

Comecei a usar o gerrit e quero saber por que precisamos fazer, em git push gerrit HEAD:refs/for/mastervez de fazergit push origin master

Se eu git push origin masterreceber o erro dizendo! [remote rejected] master -> master (prohibited by Gerrit)

Respostas:


259

A documentação do Gerrit, em particular a seção "Alterações por push" , explica que você envia para a " refs/for/'branch'referência mágica usando qualquer ferramenta cliente do Git".

A imagem a seguir é retirada da Introdução à Gerrit . Quando você empurra para Gerrit, você faz git push gerrit HEAD:refs/for/<BRANCH>. Isso envia suas alterações para a área de preparação (no diagrama "Alterações pendentes"). Gerrit na verdade não tem um ramo chamado <BRANCH>; está ao cliente git.

Internamente, a Gerrit tem sua própria implementação para as pilhas Git e SSH. Isso permite que você forneça as referências "mágicas" refs/for/<BRANCH>.

Quando uma solicitação push é recebida para criar uma referência em um desses espaços para nome, o Gerrit executa sua própria lógica para atualizar o banco de dados e, em seguida, mente ao cliente sobre o resultado da operação. Um resultado bem-sucedido faz com que o cliente acredite que a Gerrit criou a ref, mas, na realidade, a Gerrit não criou a ref. [ Link - Gerrit, "Detalhes detalhados" ].

O fluxo de trabalho da Gerrit

Após um patch bem-sucedido (ou seja, o patch foi enviado para a Gerrit, [colocando-o na área de preparação "Pending Changes"], revisado e a revisão foi aprovada), Gerrit envia a alteração de "Pending Changes" para o " Repositório autoritativo ", calculando em qual ramificação o envio deve ser baseado na mágica em que você foi enviado refs/for/<BRANCH>. Dessa forma, os patches revisados ​​com sucesso podem ser extraídos diretamente das ramificações corretas do Authoritative Repository.


Por curiosidade, o que realmente acontece se você fizer algo como "origem git push" apenas? Eu tentei e não consigo ver a mudança em lugar algum, daí a pergunta. Mas existe no meu log local, naturalmente.

1
@Pintolaranja Eu fiz o mesmo de forma acidental. Você está certo, o Gerrit "lida" com essa situação, mas não cria nenhuma alteração. Então, na verdade, ele não lida com isso. O que realmente me irrita, pois isso é realmente estúpido. Por que permitir que o usuário confirme algo que a Gerrit não consegue lidar adequadamente?
Trejder

1
@gregb Sim. As setas indicam a origem e o destino do comando, não nenhum fluxo de dados subsequente como resultado. por exemplo desenvolvedor 1 questões a buscar ao Repositório de autoridade, não o contrário
Gareth

5
@trejder Permite isso porque o Gerrit permite que você configure algumas contas para ignorar avaliações. Ao passar para a ramificação padrão, você está efetivamente dizendo "Desejo mesclar essa alteração sem uma revisão". Se você não puder fazer isso, o envio falhará.
Hounshell

4
Ou você não pode usar o gerrit e evitar completamente essa bagunça hilária.
C Johnson

57

Para evitar ter que especificar completamente o comando git push, você pode modificar o seu arquivo de configuração git:

[remote "gerrit"]
    url = https://your.gerrit.repo:44444/repo
    fetch = +refs/heads/master:refs/remotes/origin/master
    push = refs/heads/master:refs/for/master

Agora você pode simplesmente:

git fetch gerrit
git push gerrit

Isso é de acordo com Gerrit


1
+1 de mim! É muito melhor ter esse código embutido para mim em remote.origin.pushvez de digitar / colar todas as vezes!
DaoWen

7
@SeanMurphy Você pode torná-lo mais geral substituindo instâncias de 'master' por '*' para que algo como 'git push gerrit TopicBranch' também funcione.
David Doria

Além disso, se o gerrit é seu único controle remoto, você não precisa especificá-lo. Eu simplesmente faço git fetche git pushcom a configuração @DavidDoria mencionada acima.
bernk

empurrar = refs / heads / *: refs / for / * é para todos os ramos
Victor Choy

Você realmente precisa usar o ramo upstream, não o ramo atual. Normalmente, tenho uma dúzia de alterações em paralelo, portanto, usar um único ramo simplesmente não funciona.
Christian Goetze
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.