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" ].
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:
+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.
Para evitar ter que especificar completamente o comando git push, você pode modificar o seu arquivo de configuração git:
Agora você pode simplesmente:
Isso é de acordo com Gerrit
fonte
remote.origin.push
vez de digitar / colar todas as vezes!git fetch
egit push
com a configuração @DavidDoria mencionada acima.