Configurer les branches cibles pour les demandes d’extraction
Azure DevOps Services
Par défaut, Azure DevOps suggère la création de nouvelles demandes de tirage sur le branche par défaut. Dans un référentiel avec plusieurs branches utilisées pour les demandes de tirage, les propriétaires de référentiels peuvent configurer la liste des branches cibles de demande de tirage afin que ces suggestions sélectionnent la branche cible appropriée.
Pour activer cette fonctionnalité, créez un fichier avec un nom .azuredevops/pull_request_targets.yml
dans le branche par défaut du référentiel.
Ce fichier YAML doit contenir une seule liste, intitulée pull_request_targets
, contenant les noms de branche ou les préfixes qui correspondent aux branches candidates.
Par exemple, tenez compte de ce contenu :
pull_request_targets:
- main
- release/*
- feature/*
Cette liste de cibles potentielles spécifie main
en tant que branche cible à sélectionner en premier, mais si une branche commençant release/
par ou feature/
est un meilleur choix, cette branche est choisie à la place.
Pour plus d’instructions sur les demandes de tirage et les considérations de gestion, consultez À propos des demandes de tirage.
Quand cette configuration est-elle utilisée ?
Il existe plusieurs points d’entrée à l’aide d’une branche cible dynamique.
Suggestions de demande de tirage. Lorsqu’un utilisateur envoie une branche à Azure DevOps, sa prochaine visite à la page Repos peut suggérer la création d’une demande de tirage à partir de cette branche. Ce bouton « Créer une demande de tirage » choisit la branche cible de manière dynamique.
URL de la demande de tirage( Pull Request). Lorsqu’un utilisateur accède directement à la page de création de demande de tirage à l’aide d’un
sourceRef
paramètre, mais omettez letargetRef
paramètre, Azure DevOps sélectionne une branche cible en fonction de ce choix dynamique.
Il existe une fonctionnalité permettant aux outils clients de créer des demandes de tirage à l’aide de ce choix dynamique, mais ces clients doivent ajouter un signal facultatif indiquant que l’utilisateur n’a pas spécifié de branche cible. Vérifiez l’outil client de votre choix pour voir si l’option est activée.
Quels sont les bons candidats pour les cibles de branche ?
Nous recommandons que la liste configurée des branches candidates inclut uniquement les branches protégées par les stratégies de demande de tirage. Ces branches sont probablement modifiées uniquement en effectuant des demandes de tirage, ce qui garantit que la position de branche précédente se trouve dans l’historique du premier parent de la validation du pourboire. Si une stratégie de fusion est utilisée, le deuxième parent représente les validations introduites dans la branche cible en effectuant une demande de tirage et le premier parent est le conseil précédent.
Comment Azure DevOps sélectionne-t-il une branche ?
Git ne suit pas les métadonnées autour de la création d’une branche. Il n’existe aucun moyen exact de déterminer quelle branche a été utilisée lors de la création d’une branche de rubrique. Au lieu de cela, Azure DevOps utilise une heuristique basée sur l’historique du premier parent des branches.
Parmi les branches cibles possibles, Azure DevOps sélectionne la branche dont l’historique du premier parent se croise avec l’historique du premier parent de la branche source le plus.
Exemple : Aucune validation de fusion
Considérez la structure de branche suivante, qui est simplifiée plus que normale, car il n’y a pas de validations de fusion. Dans cet exemple, l’historique entier est représenté par l’historique du premier parent.
,-E---F <-- release/2024-September
/
A---B---C---D <--- main
\
`-G---H <--- feature/targets
\
`-I <--- topic
Avec cet historique et l’exemple pull_request_targets
de liste utilisé précédemment, nous avons trois branches cibles candidates, par ordre de priorité :
main
release/2024-September
feature/targets
La branche source, topic
est ensuite comparée à ces branches.
main
croise avectopic
à ,B
laissantG,I
danstopic
et non dansmain
.release/2024-September
croise avectopic
leA
départB,G,I
ettopic
non dansrelease/2024-September
.feature/targets
croise avectopic
à ,G
laissantI
danstopic
et non dansfeature/targets
.
Par conséquent, dans cet exemple, la feature/targets
branche est choisie comme branche cible pour une demande de tirage avec topic
comme branche source.
Exemple : validations de fusion
Dans un exemple plus compliqué, où la feature/targets
branche a été fusionnée main
et fusionnée main
en elle-même, l’historique des validations comporte plus de cas à prendre en compte :
,-E---F <-- release/2024-September
/
A---B---C---D---J---K <--- main
\ _/ \
\ / \
`G---H---L--\--M <--- feature/targets
\ \/
\
`I <--- topic
Ici, la validation D
main
représente une heure où feature/targets
a été fusionnée dans main
. La validation M
représente une heure dans laquelle main
a été fusionnée feature/targets
. Le lien entre les validations M
et J
est dessiné de manière à souligner qu’il J
s’agit du deuxième parent du M
L
premier parent.
Dans ce cas, lorsque vous considérez l’historique de validation complet, main
et que vous croisez tous les deux l’historique de l’at topic
G
.feature/targets
Toutefois, le premier historique parent illustre toujours une préférence pour feature/targets
.
Liens cassants
Si deux branches ont la même intersection d’historique parent, Azure Devops sélectionne la branche qui apparaît précédemment dans la pull_request_targets
liste. Si plusieurs branches sont toujours liées en fonction de la pull_request_targets
liste en raison d’une correspondance de préfixe, le plus tôt dans l’ordre alphabétique gagne.
Ces types de liens sont le plus souvent présents lorsque de nouvelles branches candidates sont créées, telles que le début d’une nouvelle branche de fonctionnalité ou la fourche d’une branche de mise en production.
,-E---F <-- release/2024-October
/
A---B---C---D <--- main
\
\
`G <--- topic
Dans cet exemple, la release/2024-October
branche a été créée hors de la main
branche après topic
avoir été ramifiée de main
. Bien que cela soit intuitif pour un lecteur humain, l’ordre des catégories et release/*
des main
catégories dans la pull_request_targets
liste indique l’ordre préféré à Azure DevOps.
Que se passe-t-il si Azure DevOps choisit la branche cible incorrecte ?
La page de création de demande de tirage a un sélecteur pour ajuster la branche cible si le choix dynamique ne correspond pas aux attentes. La branche cible peut également être ajustée une fois la demande de tirage créée.
Plus important encore, il peut être utile de comprendre pourquoi l’heuristique peut sélectionner la branche cible « incorrecte ».
Cette heuristique s’appuie sur certaines hypothèses sur la façon dont les branches cibles et la branche source ont été créées. Voici quelques raisons potentielles pour lesquelles l’heuristique ne fonctionne pas :
Les branches cibles ne sont pas protégées par les stratégies de demande de tirage. Si les branches cibles peuvent être envoyées arbitrairement, l’historique du premier parent n’est pas un indicateur fiable de l’emplacement précédent de cette branche.
La branche source a été créée à partir d’un conseil précédent d’une branche candidate. Si la branche source a choisi une validation arbitraire dans l’historique, il n’existe aucune garantie sur le premier historique parent dont elle dépend.
La branche source a été avancée à l’aide
git commit
etgit merge
aux commandes. Les commandes telles quegit reset --hard
ougit rebase
peuvent modifier l’historique de la branche de manière imprévisible.
Si vous n’êtes pas d’accord avec la branche cible choisie par cette heuristique, envisagez de mettre à jour le choix à l’aide git rebase --onto <new-target> <old-target> <source>
de . La git rebase
commande réécrit l’historique du premier parent pour que l’heuristique choisisse la nouvelle cible.
Une erreur courante que les utilisateurs font quand ils se rendent compte qu’ils sont basés sur la branche incorrecte consiste à utiliser git merge
pour amener la branche appropriée dans leur historique.
La fusion ne modifie pas l’historique du premier parent et ne modifie donc pas le choix de la branche cible.
Comment puis-je tester cette décision localement ?
L’heuristique utilisée par Azure DevOps a été contribué au client Git principal et est disponible dans les versions 2.47.0 et ultérieures de Git.
Pour tester cette logique dans votre propre référentiel, commencez par vous git fetch origin
assurer que vous disposez de la dernière version des branches cibles. Exécutez ensuite la commande suivante git for-each-ref
, ajustée pour correspondre à votre liste de branches candidates :
$ git for-each-ref --format="%(is-base:HEAD) %(refname)" \
refs/remotes/origin/main \
"refs/remotes/origin/release/*" \
"refs/remotes/origin/feature/*"
refs/remotes/origin/main
refs/remotes/origin/release/2024-September
(HEAD) refs/remotes/origin/feature/targets
Dans cette commande, la HEAD
validation est utilisée comme source et compare l’historique du premier parent des branches cibles de la même façon. Bien que chaque branche candidate soit répertoriée dans la sortie, la chaîne (HEAD)
indique quelles branches doivent être utilisées comme branche cible.