sirve - ¿Cómo configurar un refspec de envío ascendente específico para Git cuando se usa con Gerrit?
publicar tag git (4)
Aquí hay una mejora de la respuesta de Greg Hewgill .
Cree un script en algún lugar de la ruta, como en su carpeta de perfil bin (cree uno si es necesario, incluso en Windows):
$ mkdir ~/bin
$ vi ~/bin/git-submit
Con el siguiente contenido:
#!/bin/sh -e
if [ -z "$1" ]; then
REMOTE=origin
else
REMOTE=$1
fi
BRANCH=`git symbolic-ref HEAD`
case $BRANCH in
refs/heads/*)
BRANCH=`basename $BRANCH`
;;
*)
echo "I can''t figure out which branch you are on."
exit 1
;;
esac
REMOTE_BRANCH=`git config --get "branch.$BRANCH.merge"`
if [ -z $REMOTE_BRANCH ]
then
echo "There is no tracking information for the current branch."
echo "If you wish to set tracking information for this branch you can do so with:"
echo ""
echo " git branch --set-upstream $BRANCH <remote>/<branch>"
echo ""
exit 1
fi
git push $REMOTE HEAD:refs/for/$REMOTE_BRANCH
Suponiendo que creas una rama de seguimiento remoto como:
$ git checkout -b MyBranch origin/master
Usted puede simplemente llamar:
$ git submit
... para empujar a refs/for/master
en este caso.
Estoy configurando Git con Gerrit Code Review y estoy buscando una manera de hacer que los comandos necesarios de Git sean relativamente sencillos para los usuarios que podrían ser nuevos en Git.
Los comandos que tengo actualmente para iniciar una nueva rama de características son esencialmente (asumiendo que Gerrit es el origin
):
git checkout baseline
git pull
git checkout -b work1234
git push -u origin work1234
Esto inicia un nuevo paquete de trabajo work1234
ramificado desde alguna baseline
, y el impulso final crea la rama en Gerrit y establece el work1234
ascendente. Entonces .git/config
ve algo así como:
[branch "work1234"]
remote = origin
merge = refs/heads/work1234
Ahora, Gerrit quiere que las nuevas confirmaciones para revisión sean enviadas a una refspec especial, refs refs/for/work1234
por ejemplo. Puedo hacer esto manualmente con:
git push origin work1234:refs/for/work1234
Lo que me gustaría hacer es encontrar alguna manera de configurar .git/config
modo que un git push
simple de git push
empuje la rama actual a la ref. Espec. En el control remoto que requiere Gerrit. He visto las siguientes áreas de git config
:
-
branch.<name>.*
- no parece tener ninguna opción específica para configurar la ref. ref. -
push.default
- De alguna manera quieroupstream
aquí -
remote.<name>.push
- Intentéremote.<name>.push
refs/heads/*:refs/for/*
aquí, perogit push
siempre quiere impulsar todas las sucursales locales en este caso, mientras que solo quiero la sucursal actual
Si no puedo hacer que Git haga esto por sí mismo, escribiré un pequeño script de envoltorio que especifique completamente los refspecs. Sin embargo, sería mejor si Git pudiera empujar al lugar correcto de forma nativa.
Dos opciones que he encontrado:
1) Echa un vistazo a un proyecto que hice, ggh: https://github.com/hobbs/ggh
2) Puede configurar el push refspec predeterminado en su control remoto. Solo he descubierto cómo hacer esto con una rama remota codificada de forma rígida, aún intentando averiguar cómo hacer comodines en el refspec del control remoto para que siempre llegue al control remoto que está rastreando:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = ssh://gerrit/repo
push = HEAD:refs/for/master
Terminé escribiendo un nuevo script de git-submit
:
#!/bin/sh -e
if [ -z "$1" ]; then
REMOTE=origin
else
REMOTE=$1
fi
BRANCH=`git symbolic-ref HEAD`
case $BRANCH in
refs/heads/*)
BRANCH=`basename $BRANCH`
;;
*)
echo "I can''t figure out which branch you are on."
exit 1
;;
esac
git push $REMOTE HEAD:refs/for/$BRANCH
Puse este script en /usr/local/libexec/git-core/git-submit
y ahora hay un comando para enviar un nuevo código a Gerrit para su revisión:
$ git submit
Si Gerrit no es el origin
remoto, use git submit <remote>
según corresponda.
git config push.default upstream
git config branch.work1234.merge refs/for/work1234
git config branch.work1234.remote origin
o .git / config:
[push]
default = upstream
[branch "work1234"]
merge = refs/for/work1234
remote = origin
No estoy seguro de si hay una manera de colocar un comodín en cualquier lugar para que funcione para todas las sucursales.