Lassen Sie Remote-Git-Repository Merge-Commits per Push ablehnen

Was ich machen will; was ich vorhabe zu tun:

Ich möchteverbieten irgendeinMerge Commits seingeschoben in das zentrale Repository. Daseinzige Ausnahme Befindet sich die Zusammenführung zwischen Zweigen, die im zentralen Repository vorhanden sind. Ich möchte dies im zentralen Repository erzwingen.

Erklärung, warum ich das machen möchte:

Hinweis: Wenn Sie durch diese Erklärung nicht mehr auf dem Laufenden sind, was ich tun möchte, ignorieren Sie die Erklärung. Natürlich freue ich mich über weitere Lösungsmöglichkeiten für das unten erläuterte Problem, aber die Antwort, die mich interessiert, lautet, was ich wie oben beschrieben tun möchte.

Ich habe ein zentrales Git-Repository mit einem Zweig, den mehrere Entwickler verfolgen. Jeder Entwickler hat ein Remote-System für die Zweigstelle des zentralen Repository konfiguriert.

Wir befolgen für dieses Projekt eine synchrone Festschreibungsrichtlinie, sodass jeder Entwickler seine neueste Arbeit immer über dem HEAD des Remote-Zweigs ablegen muss, bevor ein Push ausgeführt wird. Ich möchte diese Richtlinie durchsetzen, indem ich nicht zulasse, dass Merge-Commits jemals an das zentrale Repository übertragen werden. Die einzige Ausnahme besteht darin, dass die Zusammenführung zwischen Zweigen erfolgt, die im zentralen Repository vorhanden sind.

Der Einfachheit halber möchte ich nicht, dass die lokalen Verfolgungszweige des Entwicklers jemals mit dem Remote-Zweig zusammengeführt werden. Aber lieber immer auf den entfernten Zweig umsteigen.

Wir haben dies teilweise auf dem Computer des Entwicklers erzwungen, indem wir branch.NAME.rebase = true gesetzt haben, um Probleme zu vermeiden, wenn der Entwickler git pull verwendet. Wir benötigen jedoch eine Lösung, um dies auf der zentralen Repository-Seite zu erzwingen.

Eine sehr einfache Lösung wäre, Commits mit dem Kommentar "Merge branch 'NAME' of GITURL" abzulehnen. Interessanter wäre jedoch eine genauere Überprüfung, ob alle Eltern eines Commits in den Zweigpfaden des zentralen Repositorys vorhanden sind.

Vorschläge? Lösungen?

Bearbeiten:

Das habe ich bisher:

#!/bin/sh
read sha1old sha1new refname

# check if this is merge commit
merge_commit="`git rev-list --parents --merges --no-walk $sha1new 2> /dev/null`"
if test -n "$merge_commit"
then
  # this was a merge commit
  # $merge_commit contains: sha1new sha1parent_1 ... sha1parent_n
fi
exit 0

Der Ort, an dem es schwierig wird, bestimmt, ob die Vorfahren von zwei Elternteilen aus einem einzigen Zweig stammen. Da der Pre-Receive-Hook aufgerufen wird, bevor Refs aktualisiert werden, weiß ich auch nicht, welche Lösung hier angezeigt wird, wenn ein Push Commits für zwei in der Remote-Instanz vorhandene Zweige enthält, einschließlich einer Zusammenführung zwischen diesen beiden Zweigen. .