Wenn ich git remote -v
in 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?
Antworten:
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:
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.quelle
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.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 denpre-push
Hook verwenden.Ein schneller Weg, um anzuhalten,
git push
ist Symlink/usr/bin/false
, um der Haken zu sein:Die Verwendung eines Hakens ermöglicht bei Bedarf eine feinkörnigere Steuerung der Stöße. Hier finden Sie
.git/hooks/pre-push.sample
ein 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:
Ein Test-Repo mit mehreren Fernbedienungen:
Pushing to
origin
ist erlaubt:Das Drücken auf eine andere Fernbedienung ist nicht zulässig:
Beachten Sie, dass das
pre-push
Hook-Skript geändert werden kann, um unter anderem eine Nachricht an stderr zu drucken, die besagt, dass der Push deaktiviert wurde.quelle
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.)
quelle
Wenn Sie bereits eine Fernbedienung eingerichtet haben und nur verhindern möchten, dass Sie versehentlich direkt auf
master
oder drückenrelease/production
, können Sie dies verhinderngit config
.Für die Aufzeichnung
no_push
ist 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_master
und es würde gut funktionieren.Weitere Infos: git-config pushRemote
quelle
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.
quelle