2009-02-09 13 views
34

Nach git clone zu vermeiden, wird die Konfiguration in der neuen Repo wie folgt aussieht:Wie git konfigurieren versehentliche git push

remote.origin.url=<some url> 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 

Dann kann ich "Git-Pull" und "git push" ausführen. Aber ich interessiere mich nur für "git pull", weil ich in ein anderes Repo drängen will.

Eines, was ich tun kann, ist:

git add remote repo-for-push <some other url> 
git push repo-for-push master 

Aber ich möchte git konfigurieren Standard und verschiedene Repositories für Pull- und Push-verwenden, dh:

git pull # pulls from origin 
git push # pushes into repo-for-push, avoiding accidental push into the origin 

Wie kann diese so konfiguriert werden, ? Vielen Dank im Voraus.

EDIT:
Grundsätzlich möchte ich die Standard-Push-Repo, um sich von der Standard-Fetch/Pull-Repo zu unterscheiden.

+0

so dass im Grunde Sie einrichten möchten die Standard-Push-Repo unterscheidet sich vom Standard-Abruf/Pull-Repo, oder? vielleicht solltest du das klären. – kch

+2

richtig, das ist das gleiche, aber mit weniger Worten, :) –

Antwort

34

Sieht aus wie

git config remote.origin.receivepack /bin/false 

macht Push-to-Remote-Ursprung scheitern.

+0

Großartig !!!! Genau das habe ich gesucht. –

+0

Sind einige Protokolle schreibgeschützt? Das würde auch dazu führen, dass das Pushing zum falschen Repository fehlschlägt. –

+0

@Andrew: Richtig, wenn Sie über das Git-Protokoll klonen, werden Sie eingestellt. – Cascabel

7

Ich bin mir nicht sicher, dass Sie dies tatsächlich in Git heute tun können. Die Implementierung von git-fetch (in builtin-fetch.c) und git-push (in builtin-push.c) rufen beide die interne Funktion remote_get (NULL) auf, um das Standard-Repository zu identifizieren, von dem aus pull-from/push-to ausgeführt werden soll.

Eine Option wäre, einen Alias ​​zu erstellen, der den gewünschten Repo angibt. Zum Beispiel:

git config --add alias.mypush "push repo-for-push" 

Dann könnten Sie:

git mypush 

zu Ihrem gewünschten Repo zu schieben. Nicht genau was du willst, natürlich. (Sie können auch das Argument --repo in Erwägung ziehen, siehe http://kerneltrap.org/mailarchive/git/2008/10/7/3537694 für ein aktuelles Dokumentupdate, das das Argument --repo klärt.)

+0

Beide Alias ​​für "Push-Repo-for-Push" und für "Push - Repo-for-Push" sind gute Umgehungslösungen. Vielen Dank. –

+0

Wie in der Antwort von @Novelocrat erwähnt, gilt dies ab 1.6.4 nicht mehr. –

0

Wenn Sie alle von einem anderen Zweig schieben könnten, denke ich, dass Sie konfigurieren könnten dieser Zweig einen eigenen Repository müssen Push-to-:

git checkout master 
git branch outbound 
git remote add destination <some url> 
git config branch.outbound.remote destination 

ich nicht versucht haben, und Sie können etwas mehr Arbeit zu schaffen eine Komplettlösung tun müssen. Es kann auch nicht für Sie arbeiten, wenn Sie vom Master drücken müssen.

+0

Mit dieser Lösung muss ich beide Zweige manuell zusammenführen und beachten Sie die aktuelle Verzweigung zu git push xor oder git pull. Nicht besser als Aliase, wenn ich git nicht konfigurieren kann, um git pull oder push zu vermeiden, wenn der aktuelle Zweig nicht der richtige ist. Vielen Dank! –

+0

Wie in der Antwort von @Novelocrat erwähnt, ist dies nicht mehr erforderlich. –

0

Wickeln Sie den "Git" -Befehl in etwas, das das Push-Argument isst. Aus der Spitze von meinem Kopf habe ich dies:

 
~$ cat /usr/local/bin/git 
#!/bin/bash 

# git wrapper 
# prevents pushing to repository 

declare -a args 
declare msg='' 
while [ $# -gt 0 ] 
do 
    if [ "$1" != 'push' ]; then 
     args=("${args[@]}" "$1") 
    else 
     msg="No pushing" 
    fi 
    shift 
done 

if [ ${#msg} -gt 0 ]; then 
    echo "$msg" 
fi 
/usr/bin/git "${args[@]}" 

Nur sicher sein, den eingewickelt Befehl in Ihrem Pfad zu haben, bevor der „realen“ git Befehl.

+0

Gute Idee, aber es sollte in Benutzer-Dateisystem sein und es sollte das aktuelle Arbeitsverzeichnis überprüfen, wenn es einige Repositories ohne diese Einschränkung gibt. Vielen Dank. –

27

In der Version 1.6.4 hat Git die Möglichkeit erhalten, per Remote-Zugriff von einer URL zu einer anderen URL zu wechseln und diese unter Verwendung der Konfigurationseinstellung remote.name.pushurl zu übertragen. Ich kann mir ein merkwürdiges Verhalten vorstellen, wenn das Push-Repository das Pull-Repository nicht verfolgt, aber ich vermute, Git wird einfach versuchen, das Push-Repository aus dem/den aktuellen/Tracking/Matching-Zweig (en) ohne Rücksicht darauf zu beschleunigen zieht, wenn er die Fernbedienung mit dem gleichen Namen anfragt.

Zum Beispiel, wenn Sie wollte über anonyme git Protokoll ziehen, sondern drücken via SSH (vielleicht müssen Sie einen Wert aus einer SecurID-Token oder etwas zu authentifizieren):

[remote "myremote"] 
    url = git://server/path 
    pushurl = [email protected]:/path