2011-08-18 16 views
17

Estoy configurando Git con Gerrit Code Review y estoy buscando una manera de hacer que los comandos Git necesarios sean relativamente sencillos para los usuarios que puedan ser nuevos en Git.¿Cómo configurar refspec de inserción ascendente específico para Git cuando se usa con Gerrit?

Los comandos tengo actualmente para el inicio de una nueva rama de la característica son esencialmente (suponiendo Gerrit es origin):

git checkout baseline 
git pull 
git checkout -b work1234 
git push -u origin work1234 

Esto inicia un nuevo paquete de trabajo work1234 ramificado de algunos baseline, y el empuje final crea la rama en Gerrit y establece el upstream. Así .git/config se ve algo como:

[branch "work1234"] 
     remote = origin 
     merge = refs/heads/work1234 

Ahora, Gerrit quiere nuevas confirmaciones para su revisión para ser empujado a un refspec especial, 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 de manera que una llanura git push empujará la rama actual a la refspec en el control remoto que requiere Gerrit. He mirado en las siguientes áreas: git config

  • branch.<name>.* - no parece tener ninguna opción específica para establecer el empuje refspec
  • push.default - En cierto modo me quiero upstream aquí
  • remote.<name>.push - Probé refs/heads/*:refs/for/* aquí, pero git push siempre quiere empujar todas las sucursales locales, en este caso, mientras que sólo quiero la rama actual

Si no puedo hacer que Git lo haga solo, escribiré un script de envoltura pequeño que especifica completamente las referencias. Sin embargo, sería mejor si Git pudiera empujar hacia el lugar correcto de forma nativa.

Respuesta

9

terminé escribiendo un nuevo git-submit guión:

#!/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 

pongo este guión en /usr/local/libexec/git-core/git-submit y ahora hay un comando para presentar nuevo código de Gerrit para su revisión:

$ git submit 

Si Gerrit es no es el control remoto origin, luego use git submit <remote> según corresponda.

+1

¿Habría una solución git-only más simple si siempre quiero presionar a un destino fijo, decir 'refs/for/master'? ([Aquí está] (http://stackoverflow.com/questions/29664305/equivalent-of-branch-name-merge-for-git-push) mi pregunta ASÍ preguntando qué versión más simple de su problema.) – Pradhan

0
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 poner un comodín en cualquier lugar allí para hacer que funcione para todas las ramas.

+0

Esto rompería la 'git-pull' ya que trataría de extraer de' refs/for/* 'que falla. El control remoto probablemente no sea necesario, ya que el valor predeterminado es "origen". – Wernight

4

dos opciones que he encontrado:

1) obtener un proyecto que hice, GGH: https://github.com/hobbs/ggh

2) Puede configurar el empuje refspec defecto en el mando a distancia.Sólo he descubierto la manera de hacer esto con una rama remota codificado, todavía tratando de encontrar la manera de Comodín el refspec a distancia de forma que siempre empuja a la distancia que está realizando el seguimiento:

[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    url = ssh://gerrit/repo 
    push = HEAD:refs/for/master 
2

Aquí es una mejora de Greg Hewgill respuesta.

Crear un script en algún lugar en el camino, al igual que en su carpeta bin de su perfil (crear 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 

que Suponiendo crear una rama de seguimiento remoto como:

$ git checkout -b MyBranch origin/master 

Usted puede simplemente llamar:

$ git submit 

... empujar a refs/for/master en este caso.

Cuestiones relacionadas