Push fusionieren Was ich tun möchte:haben Remote-git-Repository verweigern Commits auf
Ich möchte nicht zulassen jede merge verpflichtet an das zentrale Repository geschoben werden. Die einzige Ausnahme ist, wenn die Zusammenführung zwischen Zweigen ist, die im zentralen Repository vorhanden sind. Ich möchte dies am zentralen Repository erzwingen.
Erklärung, warum ich dies tun wollen:
Hinweis: Wenn diese Erklärung Sie aus der Spur, was wirft ich tun möchte, dann die Erklärung ignorieren. Natürlich bin ich glücklich, andere Möglichkeiten zu kennen, 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 Repository konfiguriert.
Wir verfolgen eine synchrone Festschreibungsrichtlinie für dieses Projekt, so dass jeder Entwickler seine neuesten Arbeiten immer auf den Remote-Zweig HEAD zurückstellen 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.
Zur Vereinfachung möchte ich nicht, dass die lokalen Tracking-Zweige des Entwicklers jemals mit der Remote-Zweigstelle zusammengeführt werden. Aber immer wieder auf die Remote-Branche rebasiert werden.
Wir haben dies teilweise auf dem Entwicklungscomputer durch die Einstellung von branch.NAME.rebase = true erzwungen, was zur Vermeidung von Problemen beiträgt, wenn der Entwickler git pull verwendet, aber wir benötigen eine Lösung, um dies auf der zentralen Repository-Seite zu erzwingen.
Eine sehr grundlegende Lösung wäre es, Commits mit dem Kommentar zu verweigern: "Verzweigung 'NAME' von GITURL", jedoch etwas mehr im Sinne der Überprüfung, ob alle Eltern eines Commits in den Zweigpfaden des zentralen Repositorys existieren interessanter sein.
Vorschläge? Lösungen?
Edit:
Dies ist, was 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 es mühsam wird ermittelt, ob die Abstammung von irgendwelchen zwei Eltern aus einem einzigen Zweig stammen. Da pre-receive hook aufgerufen wird, bevor refs aktualisiert werden, wenn ein Push Commits für zwei Zweige enthält, die in der remote existieren, einschließlich einer Zusammenführung zwischen diesen beiden Zweigen, dann habe ich keine Ahnung, was die Lösung hier wäre. .
Genaues Duplikat: http://StackOverflow.com/Questions/1997916/Git-Post-Receive-How-To-Check-If-Pushed-Branch-is-merged-with-master – Dustin
Ich stimme völlig nicht zu, dass es ist ein Duplikat. Es hat sehr wenig zu tun mit dem, was ich gefragt habe. – chris