Git - Was ist "Refspec"

13

Ich habe dieses Handbuch zur Konfiguration der fortlaufenden Integration von GitLab verfolgt mit Jenkins.

Als Teil des Prozesses ist es notwendig, den Respec wie folgt zu setzen

+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/ *

Warum dies notwendig ist, wird nicht in der Post erklärt, also begann ich online nach einer Erklärung zu suchen und schaute mir die offizielle Dokumentation sowie einige damit zusammenhängende Stack-Überlauf-Fragen so ein .

Trotzdem bin ich immer noch verwirrt -

Was genau ist refspec?

Und warum ist das oben genannte refspec notwendig - was macht es?

    
batinica 02.06.2017, 16:22
quelle

1 Antwort

21

Eine refspec sagt git, wie man Referenzen von einem entfernten zum lokalen Repo mappt.

Der Wert, den Sie aufgelistet haben, war +refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* ; Also lasst uns das kaputt machen.

Sie haben zwei Muster mit einem Abstand zwischen ihnen; Das bedeutet nur, dass Sie mehrere Regeln angeben. (Das Pro-Git-Buch bezieht sich darauf als zwei Refspecs; das ist wahrscheinlich technisch korrekter. Allerdings haben Sie fast immer die Möglichkeit, mehrere Ref-Specs aufzulisten, wenn es nötig ist, so dass es im täglichen Leben wahrscheinlich keinen großen Unterschied macht.)

Das erste Muster ist dann +refs/heads/*:refs/remotes/origin/* , das aus drei Teilen besteht:

Das + bedeutet, dass die Regel ohne Fehler angewendet wird, selbst wenn dadurch ein Zielref in einer nicht schnellen Vorwärtsbewegung bewegt würde. Ich komme darauf zurück.

Der Teil vor dem : (aber nach dem + wenn es einen gibt) ist das "source" -Muster. Das ist refs/heads/* , was bedeutet, dass diese Regel für jede Remote-Referenz unter refs/heads (Bedeutung, Zweige) gilt.

Der Teil nach dem : ist das "Ziel" -Muster. Das ist refs/remotes/origin/* .

Wenn also der Ursprung eine Verzweigung master aufweist, die als refs/heads/master dargestellt wird, wird ein Remote-Zweigverweis origin/master erstellt, der als refs/remotes/origin/master dargestellt wird. Und so weiter für irgendeinen Zweignamen ( * ).

Also zurück zu dem + ... angenommen, der Ursprung hat

%Vor%

Sie holen und, wenn Sie diese Refspec anwenden, erhalten Sie

%Vor%

(Wenn Sie typische Tracking-Regeln angewendet haben und pull angegeben haben, wird master auch auf B gezeigt.)

%Vor%

Jetzt passieren einige Dinge auf der Fernbedienung. Jemand hat vielleicht eine reset erstellt, die B gelöscht hat, dann C committed und dann einen Push erzwungen. So sagt die Fernbedienung

%Vor%

Wenn Sie holen, erhalten Sie

%Vor%

und git müssen entscheiden, ob die Verschiebung von origin/master von B nach C erlaubt wird. Standardmäßig würde dies dies nicht erlauben, da es sich nicht um einen Schnellvorlauf handelt (es würde Ihnen sagen, dass es den Pull für diese Referenz abgelehnt hat), aber da die Regel mit + beginnt, wird sie akzeptiert.

%Vor%

(Ein Pull führt in diesem Fall zu einem Zusammenführungs-Commit.)

Das zweite Muster ist ähnlich, aber für merge-requests refs (von dem ich annehme, dass es mit der Implementierung von PRs auf Ihrem Server zusammenhängt; mir ist das nicht vertraut).

Mehr über refspecs: Ссылка

    
Mark Adelsberger 02.06.2017, 16:44
quelle

Tags und Links