Как я могу избежать случайного dcommit из местного филиала - PullRequest
9 голосов
/ 10 февраля 2012

Иногда я создаю локальные ветки в git, и я хотел бы получить предупреждающее сообщение, когда я пытаюсь от них отписаться.

Как я могу предотвратить случайный выход из локального филиала?

Ответы [ 3 ]

8 голосов
/ 17 февраля 2012

Альтернативой хукам предварительной фиксации, если вы используете Linux (или Git bash, или Cygwin или аналогичный), является включение git в вспомогательную функцию оболочки. Добавьте приведенный ниже файл ~/.bashrc (для bash, Git bash) или ~/.zshrc (для zsh) или любой другой эквивалент для вашей оболочки:

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 "$@"
}

(я проверял это с помощью bash и zsh в Red Hat и bash на Cygwin)

Каждый раз, когда вы вызываете git, вы теперь будете вызывать эту функцию, а не обычный двоичный файл. Функция будет запускать git в обычном режиме, если только вы не вызываете git svn dcommit, когда присоединены к ветке, которая не является основной. В этом случае вам будет предложено подтвердить перед выполнением фиксации. Вы можете переопределить функцию, указав путь к git в явном виде (это то, что делает $real_git).

Помните, что после обновления ~/.bashrc или аналогичного вам потребуется перезагрузить его, либо запустив новый сеанс оболочки (выход и выход снова), либо запустив source ~/.bashrc.

Редактировать : В качестве усовершенствования вы можете удалить первую строку, начиная с real_git=, и заменить другие экземпляры $real_git на command git, что позволяет добиться того же, но в предпочтительном варианте. путь. Я не обновлял сам скрипт, так как не смог проверить изменения на zsh.

2 голосов
/ 13 февраля 2012

Первое, что приходит на ум, - это использование git pre-commit hook для решения проблемы. Это было бы легко для чистых репозиториев git:

Но, как обсуждалось в Хуки для git-svn , это не полностью работает. VonC придумал (принят) ответ , где он использует промежуточное голое репо, которое действует как прокси между git и SVN.

Может быть, это может помочь вам тоже.

0 голосов
/ 01 сентября 2016

Если кому-то еще это нужно для 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"
...