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?
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?
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.
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. –
Używam linux + zsh, twoje rozwiązanie nie powinno być dla mnie zbyt trudne do przystosowania, staram się, kiedy mogę. – greg0ire
Właśnie przetestowałem powyższe w zsh; to działa dobrze dla mnie. Po prostu wpisz kod do '~/.zshrc'. –
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.
Drugi link wygląda obiecująco.+1 – greg0ire
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"
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
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
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