如何避免来自本地分支的意外dcommit

时间:2012-02-10 10:46:53

标签: git git-svn git-branch dcommit

有时候,我在git中创建了本地分支,当我试图从它们中删除时,我想收到一条警告信息。

如何防止自己意外地从当地分支机构撤职?

3 个答案:

答案 0 :(得分:8)

预先提交挂钩的替代方法,如果您使用Linux(或Git bash或Cygwin或类似的),则将git包装在shell辅助函数中。将以下内容添加到您的~/.bashrc(对于bash,Git bash)或~/.zshrc(对于zsh)文件,或者等同于您的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 "$@"
}

(我在Red Hat上使用bash和zsh进行了测试,并在Cygwin上进行了bash测试)

每当你调用git时,你现在都会调用这个函数而不是正常的二进制函数。该函数将正常运行git,除非您在连接到非master的分支时调用git svn dcommit。在这种情况下,它会在提交之前提示您确认。您可以通过明确指定git的路径来覆盖该功能(这是$real_git正在做的事情)。

请记住,在更新~/.bashrc或等效内容后,您需要重新加载它,方法是启动新的shell会话(注销并重新登录)或运行source ~/.bashrc

修改:作为增强功能,您可以删除第一行,从real_git=开始,并将$real_git的其他实例替换为command git,这样就可以实现同样的事情,但在首选的方式。我没有更新脚本本身,因为我无法在zsh上测试更改。

答案 1 :(得分:2)

首先要记住的是使用git pre-commit钩子来解决问题。对于纯git repos来说这很容易:

但正如Hooks for git-svn中所讨论的那样,这并不完全有效。 VonC想出了一个(接受的)answer,他利用一个中间的裸仓,就像git和SVN之间的代理一样。

也许这对你也有帮助。

答案 2 :(得分:0)

如果其他人对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"