2010-07-21 3 views
5

Ich möchte wissen, ob es eine Möglichkeit gibt, den Standard-Push zu deaktivieren, aber den Standard-Pull beibehalten, wenn Sie Mercurial verwenden. Ich möchte das Master-Repository nicht unbeabsichtigt verschmutzen, indem ich unabsichtlich aus einem experimentellen Repository schiebe.Kannst du Standard-Push verhindern, aber Pull zulassen?

Antwort

3

Ihre Lösung ist wahrscheinlich die schnellste und ist sicherlich effektiv. Wenn es irgendeine offizielle Art und Weise wäre es ein preoutgoing Haken werden:

[hooks] 
preoutgoing = bash -c 'read -p "Really push to $HG_URL? " -n 1 RESP ; [ "$RESP" == "y" ]' 

, die Sie fragt, ob Sie schieben wollen und die URL zur Verfügung stellen, auf die sie als Erinnerung gehen würde.

+0

Hey, ich mag dieses hier, es ist ähnlich wie bei Martin, aber gibt mir die Option, fortzufahren, wenn ich die URL manuell in die Befehlszeile eintippe. Wenn Sie mir sagen können, wie man das in Powershell macht, sind wir im Geschäft. – moswald

+0

Ich denke, der Befehl für komplexe Skripts in Powershell ist wubi.exe. Worüber ich meine, Entschuldigung, ich weiß Powershell nicht. ;) –

+0

Ich habe ziemlich viel experimentiert, konnte es aber nicht ganz zum Laufen bringen. Ich werde weiter wegstecken und hier updaten, wenn ich es löse. – moswald

7

Ich konnte das lösen, indem ich folgendes in meine .hg/hgrc Datei setzte, aber ich fragte mich, ob es einen besseren/offiziellen Weg gibt.

[paths] 
default = http://server/hg/repo 
default-push = . 
+0

nie Abwärts Stimme gemeint, klickte aus Versehen. :( – sojin

+0

Diese Antwort funktioniert fast, oder funktioniert meistens, aber kann brechen, wenn "." Ein Repo enthält - zB wenn Sie Ihr Home-Verzeichnis haben. Ich habe es etwas weiter unten ausgearbeitet, um ein solches Problem zu vermeiden. –

+0

@KrazyGlew Ich glaube nicht, dass das notwendig ist. Er sagte, er mache das in '.hg/hrc', also ist es in Repo und damit relativ zur Repo-Wurzel, also würde das immer" zu sich selbst drücken ", was nie etwas tun sollte. –

2

Ich mag Ihre eigene Antwort paths.default-push = . der Einstellung - es ist einfach und es ist klar, dass es funktionieren wird.

Eine andere Möglichkeit wäre ein Pre-Push-Haken sein: (. Hier bin ich die Vorteile, wie Sie einen langen Wert über mehrere Zeilen aufteilen, indem sie in einem Mercurial Konfigurationsdatei Einrücken)

[hooks] 
pre-push = if [ $HG_PATS == "[]" -o $HG_PATS == "['default']" ]; then 
       read -p "Really push to default? " -n 1; echo 
       [ "$REPLY" == "y" ] 
      fi 

Eine Push-to-Standard sieht diese

% hg push 
Really push to default? n 
warning: pre-push hook exited with status 1 

, wo ich die n getippt. Der Hooks prüft auf keine Argumente ($HG_PATS == "[]") und einen Standardwert als Argument ($HG_PATS == "['default']") und wird Sie nur in diesen Fällen auffordern. Die Variable $HG_PATS wurde in Mercurial 1.6 eingeführt.

PS: Ich habe gesehen, dass Sie die Frage aktualisiert und nach einer Lösung in PowerShell gefragt haben, aber ich fürchte, ich weiß nichts über diese Sprache. Sie sollten jedoch in der Lage sein, die wichtigen Konzepte aus dieser Antwort selbst herauszuheben.

+0

This ist ziemlich gut, aber beseitigt es nicht vollständig die Push-Fähigkeit?Ich möchte pushen können; Ich möchte nur sicher gehen, dass ich nicht versehentlich auf den Standard schiebe. – moswald

+0

mos: Du hast Recht ... Ich habe die Antwort aktualisiert, damit du wieder pushen kannst und ich habe auch das Beste aus Ry4ans Antwort eingebaut. –

+0

Danke für das Update. Ich denke, es ist Zeit für mich, eine neue Frage zu stellen: Wie bekomme ich einen Powershell-Befehl, um in einem hg-Hook zu arbeiten? – moswald

0

Die Antwort zuvor geschrieben, in hgrc

ist fast, aber nicht ganz richtig zu setzen. Es kann z.B. wenn Sie Ihr Home-Verzeichnis hg.

Hier ist die meine aktuelle BKM Standard-Push zu deaktivieren:

ich die Idee der Einstellung paths.default-push verschönert haben in ~/.hgrc, so dass es ein bisschen mehr Selbst Dokumentieren und weniger Fehler -prone - da, wie ich unten anführe, die Standardeinstellung push = ist. Deaktiviert nicht immer das Drücken.

in ~/.hgrc

[paths] 
# my main project master repo 
project-master = ... 

#DISABLING IMPLICIT PUSH 
#  to prevent embarassment from accidentally pushing to the project master repo 
#  instead of, in my case, a repo that has fine grain commits 
#  that the rest of the team does not want to see in the project master repo 
#default-push = . 
#  this works mostly, but NOT if you use hg on your home directory 
#  since '.' in ~/.hgrc seems to be interpreted as -R ~ 
#default-push = /NONEXISTENT_default-push_--_must_specify_push_target_explicity 
#  this works ok, but I can clean up the error message using blanks 
#  keeping this around because blanks in pathnames confuses many UNIX tools 
default-push = /'NONEXISTENT default-push -- must specify push target explicitly' 
#  this amounts to disabling implicit push targets. 
+0

Sie sind wahrscheinlich besser dran, das in '.hg/hgrc' (die pro-Repo-hgrc) für Ihre experimentellen Repos anstatt in' ~ .hgrc' (die pro Benutzer hgrc). Das ist sicherlich das, was MG oben angedeutet hat. Wenn das der Fall ist, ist "." Vollkommen sicher. –

+0

~/.hrc ist genau das, was * ich * will. Ich kloniere Repos sehr, und in diesen Klonen mit frisch gemachten Voreinstellungen möchte ich verhindern, dass ich versehentlich an den falschen Ort zurückschiebe. Das Problem bei der Ausführung in /.hg/hgrc ist, dass /.hg/hgrc NICHT von Klon propagiert wird. Wenn Sie /.hg/hgrc verwenden möchten, müssen Sie es nach jedem Klon installieren. Jetzt habe ich Makefiles geschrieben, um das zu tun - hg clone project foo; make-C foo install-hgrc - aber (a) Ich glaube nicht, dass es eine Standardaktion nach dem Klon gibt, also müssen Sie einpacken. und (b) andere Benutzer der möchten dies möglicherweise nicht. –

+0

Übrigens bin ich sehr glücklich mit der Einstellung Standard-Push in ~/.hgrc. Es hat einige Verlegenheit verhindert. Allerdings möchte ich den Standard immer noch vollständig überschreiben - weil ich mir angewöhnt habe, "hg push default" einzugeben. Was NICHT ist, was Sie tun möchten, wenn Ihr Workflow in einen Bereitstellungsbereich verschoben werden soll. Eine andere Frage, vielleicht ... –

Verwandte Themen