Parfois, je crée des succursales locales dans Git, et j'aimerais obtenir un message d'avertissement lorsque j'essaie de les dcommouer. P>
Comment puis-je m'empêcher de dommage accidentellement dans une branche locale? P>
3 Réponses :
La première chose qui vient à l'esprit consiste à utiliser un crochet de pré-validation GIT pour résoudre le problème. Ce serait facile pour les repos pure git: p>
mais comme discuté dans crochets pour git-svn , cela ne fonctionne pas complètement. VONC est venu avec un (accepté) Répondre où il utilise un repo nu intermédiaire qui agit comme un type de proxy entre Git ans svn. p>
Peut-être que cela pourrait vous aider aussi. p>
Le deuxième lien semble prometteur. +1
Une alternative aux crochets de pré-validation, si vous utilisez Linux (ou Git Bash ou Cygwin ou similaire), est d'envelopper (J'ai testé cela avec Bash et ZSH sur le chapeau rouge et bash sur cygwin) p> Chaque fois que vous appelez N'oubliez pas qu'après mise à jour git code> dans une fonction d'aide à coquille. Ajoutez le ci-dessous à votre
~ / .bstructrc code> (pour bash, git bash) ou
~ / .zshrc code> (pour zsh) Fichier ou quel que soit l'équivalent correspondant à votre shell:
git code>, vous 'll appeler maintenant cette fonction plutôt que le binaire normal. La fonction exécutera Git normalement, sauf si vous appelez
git svn dcommit code> lorsqu'il est attaché à une branche qui n'est pas maître. Dans ce cas, cela vous demandera de confirmer avant de faire le commit. Vous pouvez remplacer la fonction en spécifiant le chemin d'accès à
git code> explicitement (c'est ce que le
$ real_git code> fait). P>
~ / .BASHRC code> ou équivalent, vous devez le recharger, soit en démarrant une nouvelle session shell (déconnecter et vous connecter à nouveau) ou en exécutant
source ~ / .bstrucrc code>. P>
real_git = code> et remplacer les autres instances de
$ real_git < / Code> Avec
Commande Git Code>, qui atteint la même chose mais de la manière préférée. Je n'ai pas mis à jour le script lui-même car je n'ai pas été en mesure de tester le changement de ZSH. P> P>
Incidemment, si vous souhaitez tester comment cela fonctionne, git svn dcommit --ST-Run code> déclenchera le même comportement de vérification que
git svn dcommit code>, sans essayer d'effectuer le s'engager.
J'utilise Linux + Zsh, votre solution ne devrait pas être trop difficile pour que je m'adapte, j'essaie que quand je peux.
Je viens de tester ce qui précède dans ZSH; Ça fonctionne bien pour moi. Il suffit de mettre le code dans ~ / .zshrc code>.
Si quelqu'un d'autre a besoin de cela pour 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"
Non intégré mais une idée: dès que vous branche, faites un
git config - section-section "svn-temmote.svn" "no-svn-distant" code>. Une fois que vous voulez faire le DCOMMIT, vous pouvez revenir cela.
Ou peut-être que je pourrais spécifier d'une manière ou d'une autre qu'il n'y a pas de branche en amont pour cette branche locale? Savez-vous comment je peux faire ça?
J'ai étudié cela à la lumière de votre question, mais il semble que GIT SVN ne reçoit pas le commutateur de branche locale, il pense donc qu'il est toujours sur le tronc ou la branche / la balise de départ. Cela pourrait valoir la peine de changer la ligne de branche par défaut dans le fichier de configuration pour le tester.