2012-07-05 8 views
6

Si tengo las siguientes sucursales en gitrama cambio en git por nombre parcial

1194-qa-server 
master 
remotes/origin/1178-authentication 
remotes/origin/1194-qa-server 
remotes/origin/HEAD -> origin/master 
remotes/origin/master 

quiero cambiar a una rama utilizando --just-- el número, incluso si eso requiere llamar a un script Para ejemplo:

switch_branch 1178 

y el script/solución debe hacer lo siguiente

  1. -a git branch (encontrar todas las ramas local y remota en mi repositorio)
  2. filtro por el parámetro dado ('1178' arriba)
  3. extraer el nombre de la rama que git puede utilizar
  4. cambio a esa rama

Cuál es la forma recomendada hacerlo sin tener que realizar todos estos pasos manualmente?

Estoy usando Mac OSX, si eso importa aquí.

actualización - fiesta-it (github.com/revans/bash-it) sirve mi propósito

Welcome to Bash It! 

Here is a list of commands you can use to get help screens for specific pieces of Bash it: 

    rails-help     list out all aliases you can use with rails. 
    git-help     list out all aliases you can use with git. 
    todo-help     list out all aliases you can use with todo.txt-cli 
    brew-help     list out all aliases you can use with Homebrew 
    aliases-help    generic list of aliases. 
    plugins-help    list out all functions you have installed with bash-it 
    bash-it-plugins    summarize bash-it plugins, and their installation status 
    reference <function name> detailed help for a specific function 
+0

usando bash se puede usar 'git checkout 1178 [TAB]';) – KingCrunch

+0

Y utilizando algo [de fantasía] (https://github.com/robbyrussell/oh-my-zsh/) [ayuda] (https://github.com/revans/bash-it/) es simplemente 'gco 1178 [TAB]' – Stefan

+0

Realmente no funciona para mí. Encontré algunas referencias en la web para autocompletar para hash, pero eso no es lo que estoy buscando. – ramonrails

Respuesta

0

Cambié al flujo de trabajo git-flow y me alegro por ello desde entonces.

+0

¿Cómo '' git flow' resuelve el problema del pago por nombre parcial? – bvj

9

Hay muy pocas ocasiones en las que te gustaría a la caja de remotes/origin/*. Existen, pero a los efectos de este atajo, no nos preocupemos por ellos. Esto le conseguirá lo que quiere en OSX:

git config --global alias.sco '!sh -c "git branch -a | grep -v remotes | grep $1 | xargs git checkout"' 

Luego, puede emitir git sco <number> a la caja de una rama que incluye <number> pero excluye "remotos". Puede cambiar sco para que sea lo que desee. Lo elegí para el "pago súper final".

Por supuesto, esto no funcionará terriblemente bien si tiene más de una rama que coincida con <number>. Sin embargo, debería ser un punto de partida decente.

+1

Sirve para este propósito, pero encontré bash-it better. https://github.com/revans/bash-it/ – ramonrails

3

Aquí está la solución que se me ocurrió.

[ ${#} -ne 1 ] && { echo -e "Please provide one search string" ; exit 1 ; } 
MATCHES=($(git branch -a --color=never | sed -r 's|^[* ] (remotes/origin/)?||' | sort -u | grep -E "^((feature|bugfix|release|hotfix)/)?([A-Z]+-[1-9][0-9]*-)?${1}")) 
case ${#MATCHES[@]} in 
    (0) echo "No branches matched '${1}'" ; exit 1 ;; 
    (1) git checkout "${MATCHES[0]}"  ; exit $? ;; 
esac 
echo "Ambiguous search '${1}'; returned ${#MATCHES[@]} matches:" 

for ITEM in "${MATCHES[@]}" ; do 
    echo -e " ${ITEM}" 
done 
exit 1 

me llamaron git-rcheckout ("r" para expresiones regulares, a falta de un nombre mejor) y lo puso en mi camino (que es un poco demasiado tiempo para meter con calzador en mi .gitconfig.)

Será intentar emparejar contra sucursales locales y remotas (aunque solo revisa a los lugareños) y tolerará (es decir, sin tener en cuenta los fines de la búsqueda) algunos estilos de JIRA, como las ramas que comienzan con prefijos comunes y cosas con estilo como identificadores de boletos JIRA.

e.g.Al escribir esto:

git rcheckout this 

debe coincidir con cosas como

this-branch 
feature/this-branch 
bugfix/JIRA-123-this-branch 
JIRA-123-this-branch 
remotes/origin/this-branch 
remotes/origin/feature/this-branch 
remotes/origin/bugfix/JIRA-123-this-branch 
remotes/origin/JIRA-123-this-branch 

Pero las expresiones regulares que he utilizado son suficientemente tolerante, que también se puede hacer:

git rcheckout JIRA-123 

Para acceder:

bugfix/JIRA-123-this-branch 
JIRA-123-this-branch 
remotes/origin/bugfix/JIRA-123-this-branch 
remotes/origin/JIRA-123-this-branch 

Por defecto es la búsqueda de prefijos de sucursal, pero en realidad se puede utilizar expresiones regulares para hacer las cosas más elegantes si se desea, así:

git rcheckout '.*bran' 
git rcheckout '.*is-br.*h' 
+0

Funciona para los nombres de las ramificaciones grandes que normalmente crea Jira. También es compatible con el paradigma 'git flow'. Excelente. – bvj