2012-05-05 21 views

Respuesta

203

la documentación de Gerrit, en particular la sección "Push changes", explica que se presiona a la "refs/for/'branch' ref mágico usando cualquier herramienta de cliente Git".

La siguiente imagen está tomada desde the Intro to Gerrit. Cuando presionas a Gerrit, lo haces git push gerrit HEAD:refs/for/<BRANCH>. Esto lleva sus cambios al área de ensayo (en el diagrama, "Cambios pendientes"). Gerrit en realidad no tiene una rama llamada <BRANCH>; le corresponde al cliente de git.

Internamente, Gerrit tiene su propia implementación para las pilas Git y SSH. Esto le permite proporcionar los refs "mágicos" refs/for/<BRANCH>.

Cuando se recibe una solicitud de inserción para crear una referencia en uno de estos espacios de nombres, Gerrit realiza su propia lógica para actualizar la base de datos y luego miente al cliente sobre el resultado de la operación. Un resultado exitoso hace que el cliente crea que Gerrit ha creado la referencia, pero en realidad Gerrit no ha creado la referencia. [Link - Gerrit, "Gritty Details"].

The Gerrit workflow

Después de un parche con éxito (es decir, el parche ha sido empujado a Gerrit, [ponerlo en la zona de "cambios pendientes" puesta en escena], revisado, y el examen ha pasado), empuja Gerrit el cambio de los "Cambios pendientes" al "Repositorio autorizado", calculando qué rama insertar según la magia que hizo cuando presionó refs/for/<BRANCH>. De esta forma, los parches revisados ​​con éxito se pueden extraer directamente de las ramas correctas del Authoritative Repository.

+6

Esta es una hermosa respuesta. Gracias :) – Shrayas

+0

Por curiosidad, ¿qué pasa realmente si solo haces algo como "origen de git push"? Lo probé y no puedo ver el cambio en ningún lado, de ahí la pregunta. Pero sí existe en mi registro local, naturalmente. –

+1

@Pintolaranja Hice lo mismo de manera accidental. Tienes razón, Gerrit "maneja" tal situación, pero no crea ningún cambio. Entonces, en realidad, no lo maneja en absoluto. Lo que realmente me molesta, ya que esto es realmente estúpido. ¿Por qué permitir que el usuario confirme algo que Gerrit no puede manejar correctamente? – trejder

37

Con el fin de evitar tener que especificar completamente el comando git push podría modificar alternativamente su git fichero de configuración:

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

Ahora simplemente puede:

git fetch gerrit 
git push gerrit 

Esto es de acuerdo a Gerrit

+1

+1 de mí! Es mucho mejor tener esto codificado para mi 'remote.origin.push' en lugar de tener que escribirlo/pegarlo todo el tiempo. – DaoWen

+0

Funciona como un amuleto –

+5

@SeanMurphy Puede hacerlo más general reemplazando instancias de 'master' por '*' para que algo como 'git push gerrit TopicBranch' también funcione. –