2012-02-10 13 views
9

Czasami tworzę lokalne gałęzie w git i chciałbym otrzymać komunikat ostrzegawczy, gdy próbuję dcommit od nich.Jak mogę uniknąć przypadkowego dcommit z lokalnego oddziału

Jak mogę zapobiec przypadkowemu dcommiting z lokalnego oddziału?

+0

Nie wbudowaną ale pomysł: Jak tylko gałąź, zrobić 'git config --rename-sekcja„SVN-remote.svn "" no-svn-remote "'. Gdy chcesz zrobić dcommit, możesz to zmienić. – vasquez

+0

A może mógłbym określić, że nie istnieje gałąź upstream dla tego lokalnego oddziału? Czy wiesz, jak mogę to zrobić? – greg0ire

+0

Zbadałem to w świetle twojego pytania, ale wygląda na to, że git svn nie przełącza się na lokalny oddział, więc myśli, że wciąż jest na pniu lub w kasie/filmie. Może warto spróbować zmienić domyślną linię gałęzi w pliku konfiguracyjnym, aby to przetestować. – vasquez

Odpowiedz

8

Alternatywą dla pre-commit hooków, jeśli używasz Linuksa (lub Gita Basha, Cygwina lub podobnego), jest zawijanie git w powłoce pomocniczej. Dodaj poniżej do ~/.bashrc (dla bash, Git bash) lub ~/.zshrc (na zsh) pliku, czy cokolwiek jest odpowiednikiem dla powłoki:

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]" 
} 

(mam przetestowane z bash i zsh na Red Hat i bash na Cygwin)

Gdy zadzwonisz pod numer git, będziesz teraz wywoływał tę funkcję zamiast zwykłego pliku binarnego. Funkcja uruchomi git normalnie, chyba że zadzwonisz pod numer git svn dcommit, gdy zostanie podłączony do gałęzi, która nie jest wzorcem. W takim przypadku poprosi Cię o potwierdzenie przed wykonaniem zatwierdzenia. Możesz zastąpić tę funkcję, podając bezpośrednio ścieżkę do git (tak właśnie robi $real_git).

Pamiętaj, że po aktualizacji ~/.bashrc lub równoważnej, musisz przeładować ją, rozpoczynając nową sesję powłoki (wylogowując się i ponownie logując się) lub uruchamiając source ~/.bashrc.

Edit: Jako akcesorium można usunąć pierwszą linię, zaczynając real_git= i zastąpić inne instancje $real_git z command git, która osiąga to samo, ale w korzystnej drodze. Nie zaktualizowałem samego skryptu, ponieważ nie byłem w stanie przetestować zmiany w zsh.

+0

Nawiasem mówiąc, jeśli chcesz przetestować jak to działa, 'git svn dcommit --dry-run' wywoła takie samo zachowanie sprawdzające jak' git svn dcommit', bez faktycznego próbowania wykonania samego commit. –

+0

Używam linux + zsh, twoje rozwiązanie nie powinno być dla mnie zbyt trudne do przystosowania, staram się, kiedy mogę. – greg0ire

+0

Właśnie przetestowałem powyższe w zsh; to działa dobrze dla mnie. Po prostu wpisz kod do '~/.zshrc'. –

2

Pierwszą rzeczą, która przychodzi na myśl, jest użycie haka git pre-commit do rozwiązania problemu. To byłoby łatwe dla czystych repo git:

Ale jak to omówiono w Hooks for git-svn, to nie działa w pełni. VonC wpadł na (zaakceptowany) answer, w którym wykorzystuje pośrednie nagie repo, które działa jak rodzaj pośrednika między git ans SVN.

Może to też może ci pomóc.

+0

Drugi link wygląda obiecująco.+1 – greg0ire

0

W przypadku ktokolwiek inny potrzebuje tego dla 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" 
Powiązane problemy