2011-10-27 20 views
9

Quiero detenerme accidentalmente cometiendo algo en la rama principal a menos que esté seguro. Así que probé esta secuencia de comandos para determinar en qué rama estoy pero hay un problema. Cuando se crea una nueva rama git devuelve el nombre de revoluciones maestro a pesar de que estoy en la otra ramaCómo utilizar git hook pre-commit para detener confirmaciones al maestro

$ git branch 
    ignore 
    master 
* set_support 
$ git name-rev --name-only HEAD 
master 

Ésta es mi guión.

#!/bin/sh 
# Check to see if we are on master branch. Stop accidental commits 
if [ "`git name-rev --name-only HEAD`" == "master" ] 
then 
    if [ -f i_want_to_commit_to_master ] 
    then 
     rm i_want_to_commit_to_master 
     exit 0 
    else 
     echo "Cannot commit to master branch Adrian" 
     echo "Remember to create file 'touch i_want_to_commit_to_master' to commit to master" 
    fi 
    exit 1 
fi 
exit 0 

Para Marca: Reconstruí git contra la última etiqueta estable y los mismos resultados. Solo funciona después de realizar una confirmación en la nueva rama.

$ mkdir gittest 
$ cd gittest 
$ git init 
Initialized empty Git repository in /home/adrian/gittest/.git/ 
$ touch file1 
$ git add file1 
$ git commit 
[master (root-commit) 7c56424] New file 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 file1 
$ git branch 
* master 
$ git checkout -b new_branch 
Switched to a new branch 'new_branch' 
$ git name-rev --name-only HEAD 
master 
$ git --version 
git version 1.7.7.1 
$ git branch 
    master 
* new_branch 
$ touch file2 
$ git add file2 
$ git commit 
[new_branch 1e038fb] new file 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 file2 
$ git name-rev --name-only HEAD 
new_branch 
+0

¿Qué versión de Git está usando, y de qué sistema operativo? Esos resultados de 'git branch' seguidos por' git name-rev HEAD' parecen un error (sorprendente), si realmente ha copiado y pegado con precisión. –

+0

construyo git de la fuente - la última versión se describen $ git v1.7.7-RC3 $ git --version Git versión 1.7.7-RC3 $ uname -a Linux iceweasel.bluedreamer 2.6.40.3-0.fc15 .x86_64 # 1 SMP Martes 16 de agosto 04:10:59 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux –

Respuesta

11

Este comando se utiliza para encontrar un nombre descriptivo de una confirmación. Lo que está sucediendo es que HEAD se está resolviendo primero al sha1 del commit y luego se determina un nombre. Supongo que arbitrariamente está eligiendo maestro para el nombre, ya que aparece primero en lo que git log --decorate podría encontrar.

me acaba de analizar la salida de git branch en su prueba:

"`git branch | grep \* | cut -f2 -d' '` == "master" 

o una manera más directa sería:

$(git symbolic-ref HEAD 2>/dev/null) == "refs/heads/master" 
+1

Genial - Gracias Adam - Hice un pequeño cambio pero funciona ahora si ["$ (git symbolic-ref HEAD 2>/dev/null) "==" refs/heads/master "] –

+0

Agradable ... Editaré la respuesta en beneficio de los demás. –

8

Como alternativa, se podría utilizar git rev-parse como se sugiere en this answer. Así que si la expresión sería:

"$(git rev-parse --abbrev-ref HEAD)" == "master" 
Cuestiones relacionadas