2012-02-10 11 views
9

A veces, creo ramas locales en git, y me gustaría obtener un mensaje de advertencia cuando intento comprometerme con ellas.Cómo puedo evitar un compromiso accidental de una sucursal local

¿Cómo puedo evitar que se comprometa accidentalmente en una sucursal local?

+0

No incorporado, pero una idea: Tan pronto como rama, hacer una 'sección --rename git config "SVN-remote.svn "" no-svn-remote "'. Una vez que quiera hacer el compromiso, puede revertirlo. – vasquez

+0

O tal vez podría especificar de alguna manera que no hay una rama ascendente para esta rama local? ¿Sabes cómo puedo hacer eso? – greg0ire

+0

Investigué eso a la luz de su pregunta, pero parece que git svn no obtiene el interruptor de rama local, por lo que cree que todavía está en el tronco o en la rama/etiqueta de salida. Podría valer la pena intentar cambiar la línea de sucursales predeterminada en el archivo de configuración para probar esto. – vasquez

Respuesta

8

Una alternativa a los enlaces precompuestos, si está utilizando Linux (o Git bash o Cygwin o similar), es ajustar git en una función de asistente de shell. Añadir el siguiente a su ~/.bashrc (para Bash, Git Bash) o ~/.zshrc (por zsh) archivo, o lo que es el equivalente de su shell:

real_git=$(which git) 
function git { 
    if [[ ($1 == svn) && ($2 == dcommit) ]] 
    then 
     curr_branch=$($real_git branch | sed -n 's/\* //p') 
     if [[ ($curr_branch != master) && ($curr_branch != '(no branch)') ]] 
     then 
      echo "Committing from $curr_branch; are you sure? [y/N]" 
      read resp 
      if [[ ($resp != y) && ($resp != Y) ]] 
      then 
       return 2 
      fi 
     fi 
    fi 
    $real_git "[email protected]" 
} 

(He probado esto con bash y zsh en Red Hat , y bash en Cygwin)

Siempre que llame al git, ahora llamará a esta función en lugar de al binario normal. La función se ejecutará git normalmente, a menos que esté llamando al git svn dcommit mientras está conectado a una sucursal que no es maestra. En ese caso, le pedirá que confirme antes de realizar la confirmación. Puede anular la función especificando la ruta al git explícitamente (eso es lo que está haciendo el $real_git).

Recuerde que después de actualizar ~/.bashrc o su equivalente, tendrá que volver a cargarlo, iniciando una nueva sesión de shell (cierre de sesión e inicie sesión de nuevo) o ejecutando source ~/.bashrc.

Editar: Como mejora, se puede eliminar la primera línea, comenzando real_git=, y reemplazar las otras instancias de $real_git con command git, que logra lo mismo, pero en la forma preferida. No he actualizado el script en sí, ya que no he podido probar el cambio en zsh.

+0

Por cierto, si desea probar cómo funciona esto, 'git svn dcommit --dry-run' disparará el mismo comportamiento de cheques como' git svn dcommit', sin llegar a intentar realizar la propia confirmación. –

+0

Estoy usando linux + zsh, tu solución no debería ser demasiado difícil para adaptarme, lo intento cuando puedo. – greg0ire

+0

Acabo de probar lo anterior en zsh; Funciona bien para mí. Simplemente ponga el código en '~/.zshrc'. –

2

Lo primero que se debe tener en cuenta es usar un gancho de precompilación de git para resolver el problema. Esto sería fácil para repos puros git:

Pero como se trata en Hooks for git-svn, esto no está funcionando del todo. VonC se le ocurrió una (aceptada) answer donde utiliza un repositorio desnudo intermedio que actúa como una especie de proxy entre git ans SVN.

Quizás esto también te pueda ayudar.

+0

El segundo enlace parece prometedor.1 – greg0ire

0

En caso de que alguien más tiene esto para Windows PowerShell:

function CallGit 
    { 
     if (($args[0] -eq "svn") -And ($args[1] -eq "dcommit")) { 
      $curr_branch = &{git branch}; 
      $curr_branch = [regex]::Match($curr_branch, '\* (\w*)').captures.groups[1].value 
      if ($curr_branch -ne "master") { 
       Write-Warning "Committing from branch $curr_branch"; 
       $choice = "" 
       while ($choice -notmatch "[y|n]"){ 
        $choice = read-host "Do you want to continue? (Y/N)" 
       } 
       if ($choice -ne "y"){ 
        return 
       } 
      } 
     } 
     &"git.exe" @args 
    } 
    Set-Alias -Name git -Value CallGit -Description "Avoid an accidental git svn dcommit on a local branch" 
Cuestiones relacionadas