La documentación para Gerrit, en particular la sección "Empujar cambios" , explica que usted empuja a la " refs/for/'branch'referencia mágica usando cualquier herramienta de cliente Git".
La siguiente imagen está tomada de la Introducción a Gerrit . Cuando empujas a Gerrit, lo haces git push gerrit HEAD:refs/for/<BRANCH>. Esto empuja sus cambios al área de preparación (en el diagrama, "Cambios pendientes"). Gerrit en realidad no tiene una rama llamada <BRANCH>; le miente al cliente git.
Internamente, Gerrit tiene su propia implementación para las pilas Git y SSH. Esto le permite proporcionar las refs/for/<BRANCH>referencias "mágicas" .
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 le 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 en absoluto. [ Enlace - Gerrit, "Detalles arenosos" ].
Después de un parche exitoso (es decir, el parche ha sido enviado a Gerrit, [colocándolo en el área de preparación "Cambios pendientes"], revisado y la revisión ha pasado), Gerrit empuja el cambio de "Cambios pendientes" al " Repositorio autorizado ", que calcula en qué rama empujarlo en función de 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 de Authoritative Repository.
Por curiosidad, ¿qué sucede realmente si solo haces algo como "git push origin"? Lo intenté y no puedo ver el cambio en ninguna parte, de ahí la pregunta. Pero existe en mi registro local, naturalmente.
1
@Pintolaranja Hice lo mismo por casualidad. 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 cometa algo que Gerrit no puede manejar adecuadamente?
trejder
1
@gregb Sí. Las flechas indican el origen y el destino del comando, no ningún flujo de datos posterior como resultado del mismo. por ejemplo, el desarrollador 1 emite una búsqueda en el repositorio autorizado, no al revés
Gareth
55
@trejder Lo permite porque Gerrit le permite configurar algunas cuentas para evitar las revisiones. Al pasar a la rama predeterminada, está diciendo "Quiero fusionar este cambio sin una revisión". Si no se le permite hacer eso, el empuje falla.
Hounshell
44
O no puede usar gerrit y evitar este desorden hilarante por completo.
C Johnson
57
Para evitar tener que especificar completamente el comando git push, también puede modificar su archivo de configuración git:
+1 de mi parte! ¡Es mucho mejor simplemente tener esto codificado para mí en remote.origin.pushlugar de tener que escribirlo / pegarlo cada vez!
DaoWen
77
@SeanMurphy Puede hacerlo más general reemplazando las instancias de 'master' con '*' para que algo como 'git push gerrit TopicBranch' también funcione.
David Doria
Además, si gerrit es su único control remoto, no tiene que especificarlo en absoluto. Simplemente lo hago git fetchy git pushcon la configuración @DavidDoria mencionada anteriormente.
bernk
push = refs / heads / *: refs / for / * es para todas las ramas
Victor Choy
Realmente necesita usar la rama ascendente, no su rama actual. Por lo general, tengo una docena de cambios en paralelo, por lo que usar una sola rama simplemente no funciona.
Para evitar tener que especificar completamente el comando git push, también puede modificar su archivo de configuración git:
Ahora puedes simplemente:
Esto es de acuerdo con Gerrit
fuente
remote.origin.push
lugar de tener que escribirlo / pegarlo cada vez!git fetch
ygit push
con la configuración @DavidDoria mencionada anteriormente.