時々、gitでローカルブランチを作成し、それらからdcommitしようとすると警告メッセージが表示されます。
どうすれば自分が誤って地元の支店から退去するのを防ぐことができますか?
時々、gitでローカルブランチを作成し、それらからdcommitしようとすると警告メッセージが表示されます。
どうすれば自分が誤って地元の支店から退去するのを防ぐことができますか?
Linux(またはGit bashやCygwinなど)を使用している場合、pre-commitフックの代わりに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 "$@"
}
(Red Hatではbashとzshを使用し、Cygwinではbashを使用してこれをテストしました)
を呼び出すときはいつでもgit
、通常のバイナリではなく、この関数を呼び出すことになります。git svn dcommit
マスターではないブランチに接続しているときに呼び出している場合を除き、関数は通常どおりgitを実行します。その場合、コミットを実行する前に確認を求めるプロンプトが表示されます。git
パスを明示的に指定することで関数をオーバーライドできます(これが実行され$real_git
ていることです)。
更新~/.bashrc
または同等の処理を行った後、新しいシェルセッションを開始する(ログアウトして再度ログインする)か、を実行して、リロードする必要があることに注意してsource ~/.bashrc
ください。
編集:拡張機能として、最初の行を削除し、を開始して、の他のインスタンスをreal_git=
で置き換えることができます。これにより、同じことが実現されますが、推奨される方法で実行されます。zshで変更をテストできなかったため、スクリプト自体を更新していません。$real_git
command git
最初に頭に浮かぶのは、問題を解決するためにgitpre-commitフックを使用することです。これは、純粋なgitリポジトリでは簡単です。
しかし、Hooks for git-svnで説明されているように、これは完全には機能していません。VonCは、gitとSVNの間の一種のプロキシのように機能する中間の裸のリポジトリを利用する(受け入れられた)答えを思いつきました。
多分これもあなたを助けるかもしれません。
他の誰かがWindowsPowershellでこれを必要とする場合:
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"