Verhindern Sie das Pushing zum Master auf GitHub?

Antworten:

20

Seit der ursprünglichen Frage / Antwort hat Github der Benutzeroberfläche für eingeschränkte Zweige eine neue Option hinzugefügt, mit der Sie diese einrichten können.

Pull-Request-Überprüfungen vor dem Zusammenführen erforderlich Wenn diese Option aktiviert ist, müssen alle Commits an einen nicht geschützten Zweig gesendet und über eine Pull-Anforderung mit der erforderlichen Anzahl genehmigender Überprüfungen und ohne angeforderte Änderungen gesendet werden, bevor sie in einen Zweig zusammengeführt werden können, der dieser Regel entspricht.

Bearbeiten: Die Antwort unter dieser enthält weitere Details, einschließlich der Tatsache, dass dies nicht funktioniert, wenn Sie über Administratorrechte verfügen.

Cory
quelle
47
Dies erzwingt eine Überprüfung beim Zusammenführen, hört jedoch nicht auf, sich direkt zu verpflichten und an den Master zu senden. Zumindest auf meinem Repo.
Damien
Hmm, ich denke vielleicht musst du auch den Zweig schützen?
Cory
Auf Github scheint der Mustervergleich mit dem Zweig automatisch "den Zweig zu schützen", obwohl er nicht zu funktionieren scheint. Obwohl es ein privates Repository ist, frage ich mich, ob es ein Problem bei Github sein könnte ...?
Damien
8
@Damien Haben Sie das Flag "Administratoren einschließen" gesetzt? Wenn nicht, sollten Sie immer noch in der Lage sein, direkt zum Master zu pushen. Alternativ können Sie das Pushing als anderer Benutzer ohne Administratorrechte testen.
Cerno
50

Die aktuell akzeptierte Antwort ist tatsächlich korrekt. Wenn Sie jedoch Eigentümer einer Organisation sind oder über Administratorrechte verfügen. Wenn Sie das Repo erstellt haben, können Sie dennoch auf geschützte Zweige zugreifen. Aus der Github-Dokumentation unter https://help.github.com/de/articles/about-branch-restrictions :

Organisationsinhaber und Personen mit Administratorrechten für ein Repository können jederzeit auf einen geschützten Zweig pushen.

Für jede andere Art von Mitarbeiter git pushwird fehlschlagen.

Wenn Sie das Pushing von qt all wirklich deaktivieren möchten, müssen Sie dies lokal einrichten, indem Sie pushRemotewie zuvor erwähnt einen ungültigen für einen Zweig konfigurieren :

git config branch.master.pushRemote no_push

oder Sie können einen Pre-Push-Haken wie hier gezeigt einrichten: https://gist.github.com/vlucas/8009a5edadf8d0ff7430

Ignacio Arces
quelle
7

Sie können Zweigstellenbeschränkungen aktivieren und entscheiden, wer (in Bezug auf Benutzer und Teams der Organisation) pushen darf.

https://help.github.com/articles/about-branch-restrictions/

«Hinweis: Wenn die Option" Administratoren einschließen "aktiviert ist und Sie die erforderlichen Statusprüfungen für den Zweig aktiviert haben und dieser fehlschlägt, schlägt jeder Versuch, Änderungen an den Basiszweig zu übertragen, ebenfalls fehl, unabhängig vom Berechtigungsstatus eines Benutzers oder Teams.»

phd
quelle
18
Aber ist es möglich, Push von lokal zu remote zu verhindern und nur das Zusammenführen per Pull-Request auf der Github-Benutzeroberfläche zu akzeptieren?
Marvhock
7
Fwiw, um zu verhindern, dass lokal auf Master geschoben wird, können Sie Ihrer Git-Konfiguration Folgendes hinzufügen : git config branch.master.pushRemote no_push.
Nikhita Raghunath
@marvhock das ist jetzt möglich (habe gerade eine Antwort hinzugefügt)
Cory
6

Das direkte Drücken auf den Remote-Master wird abgelehnt, wenn Statusprüfungen aktiviert sind. Dies bedeutet, dass die einzige Möglichkeit, Commits auf dem Remote-Master hinzuzufügen, darin besteht, Pull-Anforderungen (die die Statusprüfungen bestehen) auf GitHub zusammenzuführen.

Hier ist mein Versuchsergebnis für den Hauptzweig, für den Statusprüfungen erforderlich sind:

  1. Erstellen Sie ein Commit für den Hauptzweig auf meinem PC.
  2. Zum Master der Fernbedienung drücken.
  3. Eine Ablehnungsmeldung wird angezeigt. Das Commit wird am Ende nicht auf Remote übertragen.
C:\GitRepo\GitHub\TomoyukiAota\photo-location-map [master ↑1]> git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 305 bytes | 305.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: 3 of 3 required status checks are expected.
To https://github.com/TomoyukiAota/photo-location-map.git
 ! [remote rejected] master -> master (protected branch hook declined)
error: failed to push some refs to 'https://github.com/TomoyukiAota/photo-location-map.git'
C:\GitRepo\GitHub\TomoyukiAota\photo-location-map [master ↑1]>
Tomoyuki Aota
quelle
3

Wenn Sie Free-Plan für Private Repo in Github verwenden, können Sie möglicherweise die Funktion für geschützte Zweige nicht verwenden. Sie müssen also jeden Push / Commit von lokal blockieren.

Dies habe ich getan, damit es lokal funktioniert und an alle Repo-Mitglieder verteilt wird.

Zunächst müssen Sie Husky installieren, um den Pre-Commit- und Pre-Push-Hook zu steuern. Dann habe ich ein Pre-Push-Bash-Skript erstellt und es im Repository festgeschrieben. Rufen Sie dann dieses Skript vom Husky-Pre-Push-Hook mit dem Husky-Parameter auf.

Dies ist meine Husky-Konfiguration im Inneren package.json(Sie können eine separate Konfiguration festlegen, wenn Sie möchten)

"husky": {
    "hooks": {
        "pre-commit": "./commands/pre-commit",
        "pre-push": "./commands/pre-push $HUSKY_GIT_STDIN"
    }
},

Wie Sie sehen können, habe ich zwei Skripte, eines für Pre-Push und eines für Pre-Commit.

Und das ist mein commands/pre-pushBash-Skript

#!/bin/bash

echo -e "===\n>> Talenavi Pre-push Hook: Checking branch name / Mengecek nama branch..."

BRANCH=`git rev-parse --abbrev-ref HEAD`
PROTECTED_BRANCHES="^(master|develop)"

if [[ $1 != *"$BRANCH"* ]]
then
  echo -e "\n🚫 You must use (git push origin $BRANCH) / Anda harus menggunakan (git push origin $BRANCH).\n" && exit 1
fi

if [[ "$BRANCH" =~ $PROTECTED_BRANCHES ]]
then
  echo -e "\n🚫 Cannot push to remote $BRANCH branch, please create your own branch and use PR."
  echo -e "🚫 Tidak bisa push ke remote branch $BRANCH, silahkan buat branch kamu sendiri dan gunakan pull request.\n" && exit 1
fi

echo -e ">> Finish checking branch name / Selesai mengecek nama branch.\n==="

exit 0

Das Skript wird im Grunde zwei Dinge tun:

  • Dieses Skript blockiert jeden, der versucht, auf einen bestimmten Zweig zu pushen (in meinem Fall möchte ich nicht, dass jemand - auch ich - direkt auf einen Zweig pusht masterund developverzweigt). Sie müssen in ihrer eigenen Niederlassung arbeiten und dann eine Pull-Anfrage erstellen.
  • Dieses Skript blockiert jeden, der versucht, auf einen Zweig zu pushen, der sich von seinem aktuell aktiven Zweig unterscheidet. Zum Beispiel sind Sie in der Verzweigung, fix/someissueaber dann geben Sie fälschlicherweise ein git push origin master.

Ausführlichere Anweisungen finden Sie in diesem Artikel:
https://github.com/talenavi/husky-precommit-prepush-githooks

Christian Chandra
quelle
1

Wenn Sie Node verwenden, können Sie mit Husky eine Pre-Push-Validierung erstellen, bei der kein direkter Push an den Master erfolgt. Auf diese Weise können Sie Ihre Administratorrechte weiterhin zum Zusammenführen von PRs verwenden. Ich denke, andere Sprachen haben ähnliche Lösungen wie Husky.

  1. npm install husky --save-dev
  2. In /.huskyrc.js:
const preventPushToMaster = `branch=\`git symbolic-ref HEAD\`
if [ "$branch" = "refs/heads/master" ]; then
    echo "\\033[31mDirect push to master is not allowed.\\033[0m"
    exit 1
fi`;

module.exports = {
  hooks: {
    'pre-push': preventPushToMaster,
  },
};
tal952
quelle