¿Por qué se usa git push gerrit HEAD: refs / for / master en lugar de git push origin master


148

Acabo de comenzar a usar Gerrit y quiero saber por qué debemos hacerlo en git push gerrit HEAD:refs/for/masterlugar de hacerlogit push origin master

Si lo hago git push origin masterme sale el error diciendo! [remote rejected] master -> master (prohibited by Gerrit)

Respuestas:


259

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" ].

El flujo de trabajo de Gerrit

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:

[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 puedes simplemente:

git fetch gerrit
git push gerrit

Esto es de acuerdo con Gerrit


1
+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.
Christian Goetze
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.