¿Cómo puedo evitar un compromiso accidental de una sucursal local?

A veces, creo twigs locales en git, y me gustaría recibir un post de advertencia cuando bash comprometerme con ellas.

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

Una alternativa para preenganchar ganchos, si está utilizando Linux (o Git bash o Cygwin o similar), es ajustar git en una function auxiliar de shell. Agregue lo siguiente a su file ~/.bashrc (para bash, Git bash) o ~/.zshrc (para zsh), o cualquiera que sea el equivalente para 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 "$@" } 

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

Cada vez que llamas a git , estarás llamando a esta function en lugar de al binary normal. La function se ejecutará git normalmente, a less que llame a git svn dcommit mientras está conectado a una twig que no es maestra. En ese caso, le pedirá que confirme antes de realizar la confirmación. Puede anular la function especificando la ruta a git explícitamente (eso es lo que está haciendo $real_git ).

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

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

Lo primero que se debe tener en count es usar un gancho de precompilation de git para resolver el problema. Esto sería fácil para repositorys git puros:

  • Bloquear twigs remotas (actualizar gancho): ¿Hay alguna manera de bloquear una twig en GIT?
  • Bloquear twigs locales (anzuelo precompromiso): ¿ Bloquear una twig para que no se pueda organizar / comprometer? (Solo fusionado / etc)

Pero como se discutió en Hooks para git-svn , esto no está funcionando del todo. A VonC se le ocurrió una respuesta (aceptada) en la que utiliza un repository desnudo intermedio que actúa como una especie de proxy entre git ans SVN.

Quizás esto podría ayudarte también.

En caso de que alguien más lo necesite 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"