Git - Was ist "Refspec"
Habe ich diese Anleitung auf konfigurieren GitLab continuous integration mit Jenkins.
Als Teil des Prozesses, ist es notwendig, die jeweiligen wie folgt
+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/
*
Warum dies notwendig ist, ist nicht in der post erklärt, und so begann ich, mich online für eine Erklärung und schaute auf die offizielle Dokumentation sowie einige Verwandte stack overflow Fragen wie diese.
Trotz dieser, ich bin immer noch verwirrt -
Was genau ist refspec?
Und warum ist die oben refspec notwendig - was tut es?
- Dieser ist ziemlich breit, was konkret hast du nicht z.B., dass die Dokumentation?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer refspec sagt git, wie die Zuordnung von Referenzen von einem entfernten auf den lokalen repo.
Den Wert, den Sie aufgeführt wurde
+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*
; also lassen Sie uns brechen, dass nach unten.Haben Sie zwei Muster, die mit einem Raum zwischen Ihnen; dies bedeutet nur, Sie geben mehrere Regeln. (Das pro git-Buch bezieht sich auf diese als zwei refspecs; das ist wohl technisch korrekt. Allerdings werden Sie fast immer haben die Fähigkeit, Liste mehrere refspecs wenn Sie brauchen, um, so in den Tag zu Tag Leben, das es wahrscheinlich macht wenig Unterschied.)
Die ersten Muster, dann ist
+refs/heads/*:refs/remotes/origin/*
hat drei Teile:Den
+
Mittel, um die Regel anwenden, ohne Fehler, selbst wenn dabei bewegen würde, ein Ziel-ref in eine nicht-fast-forward-Manier. Ich komme noch darauf zurück.Den Teil vor dem
:
(aber nach der+
wenn es eine ist) die "source" - Muster. Das istrefs/heads/*
, was bedeutet diese Regel gilt für jede remote-Referenz unterrefs/heads
(was bedeutet, Zweige).Den Teil nach dem
:
ist die "Ziel" - Muster. Das istrefs/remotes/origin/*
.Also, wenn der Ursprung hat eine Niederlassung
master
, dargestellt alsrefs/heads/master
, so erstellen Sie einen remote-branch Referenzorigin/master
vertreten alsrefs/remotes/origin/master
. Und so weiter für jeden Zweig-name (*
).Also zurück
+
... angenommen, der UrsprungHolen Sie sich und, die Anwendung, die refspec erhalten Sie
(Wenn Sie typische tracking-Regeln und hat einen
pull
haben Sie auchmaster
wies aufB
.)Nun einige Dinge geschehen auf der Fernbedienung. Jemand habe vielleicht eine
reset
löschenB
, dann verpflichtetC
, dann gezwungen, einen push. Also die remote, sagtWenn Sie Holen, Sie bekommen
und git müssen entscheiden, ob Sie erlauben das verschieben von
origin/master
ausB
zuC
. Standardmäßig würde es nicht zulassen, weil dies nicht einem fast-forward - (würde es Ihnen sagen, es abgelehnt, den Zug für die das "ref"), aber da die Regel beginnt mit+
so wird es akzeptieren.(Pull wird in diesem Fall dazu führen, dass ein merge-commit.)
Das zweite Muster ist ähnlich, aber für
merge-requests
refs (die ich annehmen, ist in Bezug auf Ihre server die Umsetzung von PR -, ich bin nicht mit ihm vertraut).Mehr über refspecs: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec
+refs/heads/*:refs/remotes/origin/*
+refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*
zwei refspecs, nicht eine refspec mit zwei mustern.