Git: Richten Sie eine Nur-Abruf-Fernbedienung ein?

132

Wenn ich git remote -vin einem meiner Git-Repositorys ausgeführt werde, für das eine oder mehrere Fernbedienungen konfiguriert sind, werden auf jeder Fernbedienung sowohl Abruf- als auch Push-Spezifikationen angezeigt:

$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)

Für Fernbedienungen, die auf Peer-Entwickler verweisen, ist kein Push erforderlich, und Git lehnt es ohnehin ab, auf ein nicht nacktes Repository zu pushen. Gibt es eine Möglichkeit, diese Fernbedienungen als "Nur Abrufen" ohne Push-Adresse oder Funktionen zu konfigurieren?

mtbkrdave
quelle
4
@sehe, nein, du kannst nicht. Wenn keine Push-URL angegeben ist, verwenden Pushs die Abruf-URL.
Joo

Antworten:

191

Ich glaube nicht, dass Sie die Push-URL entfernen können , Sie können sie nur überschreiben , um etwas anderes als die Pull-URL zu sein. Ich denke, der nächste, den Sie bekommen, ist ungefähr so:

$ git remote set-url --push origin no-pushing
$ git push
fatal: 'no-pushing' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Sie setzen die Push-URL auf no-pushing, die git nicht finden kann, solange Sie keinen gleichnamigen Ordner in Ihrem Arbeitsverzeichnis haben. Sie zwingen git im Wesentlichen dazu, einen Ort zu verwenden, der nicht existiert.

Daniel Brockman
quelle
14
Ja, Sie würden denken, "git remote set-url --delete --push. *" Würde den Trick machen, aber wenn Sie die Push-URL löschen, wird standardmäßig die Abruf-URL verwendet.
Jojo
6
Ich persönlich bevorzuge die Verwendung von etwas wie " NICHT ERLAUBT ", das sichtbarer ist. Aber das ist nur Geschmackssache.
Pierre-Olivier Vares
@ Pierre-OlivierVares Was ist mit 'DONTPUSH' ?! :)
Ali Shakiba
Zu Ihrer Information , danach sollte Ihre Git-Konfigurationsdatei folgendermaßen aussehen: (Beachten Sie die neue Pushurl- Option) [remote "origin"] fetch = + refs / Heads / *: refs / remotes / origin / * url = ssh: // host / Pfad / zu / Repo pushurl = ssh: // Host / No-Pushing / Repo
Jaywilliams
1
Ähnlich wie bei @ Pierre-OlivierVares ging ich mit git remote set-url --push origin -- --read-only--- beachten Sie das Extra --, um einen Namen mit führenden Bindestrichen zuzulassen. Das fühlte sich für mich lesbarer an.
Lindes
13

Abgesehen davon, dass die Push-URL in etwas Ungültiges geändert wird (z. B. git remote set-url --push origin DISABLED), kann man auch den pre-pushHook verwenden.

Ein schneller Weg, um anzuhalten, git pushist Symlink /usr/bin/false, um der Haken zu sein:

$ ln -s /usr/bin/false .git/hooks/pre-push
$ git push
error: failed to push some refs to '...'

Die Verwendung eines Hakens ermöglicht bei Bedarf eine feinkörnigere Steuerung der Stöße. Hier finden Sie .git/hooks/pre-push.sampleein Beispiel, wie Sie verhindern können, dass Work-in-Progress-Commits verschoben werden.

Um zu verhindern, dass auf einen bestimmten Zweig verschoben wird, oder um das Verschieben auf einen einzelnen Zweig zu beschränken, wird dies in einem Beispielhaken beschrieben:

$ cat .git/hooks/pre-push
#!/usr/bin/sh

# An example hook script to limit pushing to a single remote.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If this script exits with a non-zero status nothing will be pushed.

remote="$1"
url="$2"

[[ "$remote" == "origin" ]]

Ein Test-Repo mit mehreren Fernbedienungen:

$ git remote -v
origin  ../gitorigin (fetch)
origin  ../gitorigin (push)
upstream        ../gitupstream (fetch)
upstream        ../gitupstream (push)

Pushing to originist erlaubt:

$ git push origin
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 222 bytes | 222.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../gitorigin
 * [new branch]      master -> master

Das Drücken auf eine andere Fernbedienung ist nicht zulässig:

$ git push upstream
error: failed to push some refs to '../gitupstream'

Beachten Sie, dass das pre-pushHook-Skript geändert werden kann, um unter anderem eine Nachricht an stderr zu drucken, die besagt, dass der Push deaktiviert wurde.

Rodolfo Carvalho
quelle
Gute Idee! Ohne ein ausführlicheres Skript würden Sie Push für alle Fernbedienungen deaktivieren.
v01pe
1
@ v01pe ja. Ich habe die Antwort um ein Beispielskript aktualisiert. Es braucht nicht wirklich viel, um Pushs in einen einzelnen Zweig zu filtern. Ein Shell Oneliner würde reichen.
Rodolfo Carvalho
4

Die allgemeine Aussage "Git weigert sich, in ein nicht nacktes Repository zu pushen" ist nicht wahr. Git weigert sich nur, in ein nicht nacktes Remote-Repository zu pushen, wenn Sie versuchen, Änderungen zu pushen, die sich im selben Zweig wie das ausgecheckte Arbeitsverzeichnis des Remote-Repositorys befinden.

Diese Antwort gibt eine einfache Erklärung: https://stackoverflow.com/a/2933656/1866402

(Ich füge dies als Antwort hinzu, weil ich noch nicht genug Ruf habe, um Kommentare hinzuzufügen.)

pkeller
quelle
Ein nacktes Repository hat per Definition kein ausgechecktes Arbeitsverzeichnis. Sie können jedoch zu einem bestimmten Zweig darauf pushen.,
Ed Randall
1

Wenn Sie bereits eine Fernbedienung eingerichtet haben und nur verhindern möchten, dass Sie versehentlich direkt auf masteroder drücken release/production, können Sie dies verhindern git config.

# prevent pushing to branch: master
$ git config branch.master.pushRemote no_push

# prevent pushing to branch: release/production
$ git config branch.release/production.pushRemote no_push

Für die Aufzeichnung no_pushist kein spezieller Name. Es ist nur der Name eines nicht existierenden Zweigs. Sie könnten also verwenden $ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_masterund es würde gut funktionieren.

Weitere Infos: git-config pushRemote

PaulMest
quelle
0

Wenn Sie die Kontrolle über das Repository haben, können Sie dies erreichen, indem Sie Berechtigungen verwenden. Der Benutzer, der das Repository abruft, sollte keine Schreibberechtigungen für das Master-Repository haben.

Abhilash
quelle
Wenn Sie die Dateien nicht ändern können, können Sie auch keine neuen Änderungen abrufen.
Nur ein Student