Was ich tun möchte:
Ich will nicht zulassen jede Merge Commits gedrückt werden zum zentralen Repository. Die einzige Ausnahme ist, wenn die Zusammenführung zwischen Zweigen erfolgt, die im zentralen Repository vorhanden sind. Ich möchte dies am zentralen Repository erzwingen.
Erklärung, warum ich das tun möchte:
Hinweis: Wenn Sie durch diese Erklärung nicht auf die Spur kommen, was ich tun möchte, ignorieren Sie die Erklärung. Natürlich bin ich glücklich, andere Möglichkeiten zu kennen, um das Problem zu lösen, das ich unten erkläre, aber die Antwort, die mich interessiert, ist, was ich tun möchte, wie oben erwähnt.
Ich habe ein zentrales Git-Repository mit einem Zweig, den mehrere Entwickler verfolgen. Jeder Entwickler hat eine Remote für den Zweig dieses zentralen Repositorys konfiguriert.
Wir verfolgen eine synchrone Festschreibungsrichtlinie für dieses Projekt, so dass jeder Entwickler seine letzte Arbeit immer auf den Remote-Zweig HEAD ablegen muss, bevor er pusht. Ich möchte diese Richtlinie erzwingen, indem ich die Übertragung von Zusammenführungs-Commits in das zentrale Repository verbiete. Die einzige Ausnahme ist, wenn die Zusammenführung zwischen Zweigen erfolgt, die im zentralen Repository vorhanden sind.
Um zu vereinfachen, möchte ich nicht, dass die lokalen Verfolgungszweige des Entwicklers jemals mit der entfernten Verzweigung zusammengeführt werden. Aber immer wieder auf die Remote-Branche referenziert werden.
Wir haben teilweise durchgesetzt werden diese auf der Maschine des Entwicklers durch Einstellen branch.NAME.rebase = true, die Vermeidung von Problemen hilft, wenn der Entwickler-Git-Pull verwendet, jedoch brauchen wir eine Lösung, diese auf der zentralen Repository Seite zu erzwingen.
Eine sehr Basislösung wäre Commits mit dem Kommentar zu verweigern: „Merge Zweig‚NAME‘von GITURL“, jedoch etwas mehr entlang den Linien zu überprüfen, ob alle Eltern eines begehen im zentralen Repository Zweigpfade existieren würde interessanter.
Vorschläge? Lösungen?
Bearbeiten:
Das habe ich bisher:
%Vor%Der Ort, an dem es lästig wird, ist, festzustellen, ob die Abstammung von zwei Elternteilen aus einem einzigen Zweig stammt. Auch, weil pre-receive Hook aufgerufen wird, bevor Refs aktualisiert werden, wenn ein Push-Commits für zwei Zweige enthält, die in den entfernten existieren, einschließlich einer Zusammenführung zwischen diesen beiden Zweigen, dann habe ich keine Ahnung, was hier die Lösung sein würde .. .
Eine Möglichkeit, Pushs zu verhindern, die nichtlineare Chronik erzeugen, besteht darin, einen pre-receive
Hook einzurichten, der git rev-list --parents <OLD>..<NEW>
verwendet, um nach neuen Commits zu suchen, die mehr als ein Elternteil haben. Um die zweite Anforderung zu erfüllen, können Sie stattdessen überprüfen, ob diese Commits bei vorhandenen mehreren Zweigen im Repository vorhanden sein müssen. Ich habe das nicht sehr getestet, aber dieser pre-receive
-Hook (oder eine Variante davon) könnte das sein, was Sie wollen:
Ich hoffe, das ist von Nutzen.