87 votes

Git - Qu'est-ce que "Refspec"?

J'ai suivi ce guide sur la configuration de GitLab intégration continue avec Jenkins.

Dans le cadre du processus, il est nécessaire de définir la respécialisation comme suit

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

Pourquoi cela est nécessaire n'est pas expliqué dans le post, j'ai donc commencé à regarder en ligne pour une explication et regarda la documentation officielle ainsi que quelques débordement de pile questions comme celui-ci.

En dépit de cela, je suis toujours confus -

Qu'est-ce exactement refspec?

Et pourquoi est-le au-dessus de refspec nécessaire - que fait-il?

110voto

Mark Adelsberger Points 20504

Un refspec indique à git comment la carte des références à partir d'une télécommande pour le local des pensions.

La valeur que vous avez indiquée a été +refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*; donc, nous allons casser vers le bas.

Vous avez deux modèles avec un espace entre eux; cela signifie simplement que vous êtes en donnant de multiples règles. (Le pro git livre se réfère à ce que les deux refspecs; ce qui est probablement techniquement correct. Toutefois, vous serez toujours avoir la possibilité de lister plusieurs refspecs si vous en avez besoin, donc, dans la vie de tous les jours il a probablement fait peu de différence.)

Le premier motif, alors, est - +refs/heads/*:refs/remotes/origin/* qui a trois parties:

L' + moyens d'appliquer la règle sans échec, même si cela entraîne un déplacement d'une cible ref dans un non-fast-forward manière. Je vais revenir.

La partie avant de l' : (mais après l' + si il y en a un) est la "source" de modèle. C'est refs/heads/*, ce qui signifie que cette règle s'applique à toute distance de référence en vertu de l' refs/heads (ce qui signifie, les branches).

La partie après le : est la "destination" de modèle. C'est refs/remotes/origin/*.

Donc, si l'origine a une succursale master, représentée comme refs/heads/master, cela permettra de créer une branche distante de référence origin/master représentés en refs/remotes/origin/master. Et ainsi de suite pour tout nom de la branche (*).

Donc, retour à que +... supposons que l'origine a

A --- B <--(master)

Vous chercher et, en l'appliquant refspec vous obtenez

A --- B <--(origin/master)

(Si vous avez appliqué typique règles de suivi et a fait un pull vous avez également master a souligné B.)

A --- B <--(origin/master)(master)

Maintenant, certaines choses se produire sur la télécommande. Quelqu'un peut-être effectué reset qui a effacé B, puis commis C, puis a forcé à pousser. Si la télécommande dit

A --- C <--(master)

Lorsque vous chercher, vous obtenez

A --- B
 \
  C

et git doivent décider d'autoriser le déplacement de l' origin/master de B de C. Par défaut, il ne permettrait pas cela parce que ce n'est pas un fast-forward (il vous dira qu'il a rejeté la tirer pour qu'ref), mais parce que la règle commence par + il va l'accepter.

A --- B <--(master)
 \
  C <--(origin/master)

(Un pull dans ce cas aboutir à une fusion s'engager.)

La deuxième tendance est similaire, mais pour l' merge-requests refs (qui je suppose est lié à votre serveur de mise en œuvre de la PR; je ne suis pas familier avec elle).

Plus sur refspecs: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X