Wie erhalte ich einen Zweignamen mit einem Schrägstrich in Azure DevOps?
Lesezeit: 4 Minuten
Azure Devops bietet zwei Variablen, die Informationen über den Namen des aktuellen Git-Zweigs enthalten: $(Build.SourceBranchName) und $(Build.SourceBranch).
Während SourceBranch enthält den vollständigen Verweis auf die Branche, SourceBranchName soll nur den kurzen Zweignamen enthalten.
Leider ist das Verhalten etwas unerwartet, wenn der Zweigname einen Schrägstrich enthält (/):
+---------------------------------------------------------------------------------------------------------+
| Situation | Git branch name | Build.SourceBranch | Build.SourceBranchName |
|---------------------------------------------------------------------------------------------------------|
| branch name contains no slash | mybranch | refs/heads/mybranch | mybranch |
| branch name contains slash | release/mybranch | refs/heads/release/mybranch | mybranch |
+---------------------------------------------------------------------------------------------------------+
Der Teil des Zweignamens vor dem Schrägstrich wird nicht als Teil des Zweignamens betrachtet. Mein Kollege wies darauf hin, dass dies der Fall ist dokumentiertes Verhalten von Azure Devops:
Git-Repo-Branch oder Pull-Request: Das letzte Pfadsegment in der ref. In refs/heads/master ist dieser Wert beispielsweise master. In refs/heads/feature/tools ist dieser Wert tools.
Ich bin mir nicht sicher, ob dieses Verhalten besonders nützlich ist: Ich möchte den Zweig auschecken und brauche dazu den Zweignamen enthalten der Schrägstrich. Wenn der Teil vor dem Schrägstrich entfernt wird, kann es außerdem zu Verwirrung über den tatsächlichen Pfad kommen, da der Name mehrdeutig sein könnte.
Ich brauche den Filialnamen einschließlich der Schrägstrich. Gibt es einen einfachen Weg, es zu bekommen? Muss ich sicherheitshalber immer mit dem vollen Ref arbeiten?
Es ist so schwer zu entscheiden, was richtiger ist lol
– Hey
9. Februar 2020 um 22:07 Uhr
Hallo, danke für deine freundliche Antwort. Beide Antworten sind in Ordnung, dasselbe Konzept nur mit unterschiedlicher Implementierung. Sie können eine weitere Anwendung für Ihre Situation auswählen. Wie du willst.
– PatrickLu-MSFT
10. Februar 2020 um 12:24 Uhr
Schamrai Aleksander
Ich benutze immer Build.SourceBranch in meinen Skripten. Weisen Sie es einfach einer neuen Variablen zu und entfernen Sie es refs/heads/ von Anfang an. Ich verwende nur für CI und PR:
Für CI. ich benutze Build.SourceBranch variabel ohne refs/heads. Ich arbeite mit PowerShell:
Für PR. ich benutze System.PullRequest.SourceBranch variabel ohne refs/heads Weil Build.SourceBranch enthält den Pfad zum entfernten PR. Die Ersetzung ist die gleiche wie in der ersten Option, verwenden Sie einfach die richtige Variable.
Haben Sie eine zusätzliche Logik für Fälle, in denen Sie auf einer PR oder einem Tag aufbauen?
– Hey
29. Januar 2020 um 1:10 Uhr
Wenn Sie auf einer PR aufbauen, könnten Sie verwenden System.PullRequest.SourceBranch und System.PullRequest.TargetBranch Variablen.
System.PullRequest.TargetBranch
Der Branch, der das Ziel einer Pull-Anfrage ist. Zum Beispiel: refs/heads/master. Diese Variable wird nur initialisiert, wenn der Build aufgrund einer Git-PR ausgeführt wurde, die von einer Verzweigungsrichtlinie betroffen ist.
Außerdem können Sie auch Ihre eigene Variable basierend auf Ihren Anforderungen definieren, wenn Sie den vollständigen oder kurzen Pfad verwenden möchten.
Erstellen Sie einfach ein Bash-Skript, das einer Variablen den kürzeren Zweignamen zuweist.
Ja, aber Sie müssen verwenden Build.SourceBranch !!! Die var in deinem Beispiel SourceBranchName gibt nur das letzte Pfadsegment in der Referenz zurück.
– Chris
16. Juni um 12:37 Uhr
Abgesehen von dem Fehler, auf den @Chris hingewiesen hat, sollte dies die akzeptierte Antwort sein
– lvilasboas
24. Juni um 12:39 Uhr
Es ist wild, dass es dafür noch keine richtige Lösung gibt.
Hier ist, was wir haben, basierend auf der Kombination einiger Dinge, die ich beim Googeln gefunden habe. Dies ist für Zweigstellen und PR’s
Es ist so schwer zu entscheiden, was richtiger ist lol
– Hey
9. Februar 2020 um 22:07 Uhr
Hallo, danke für deine freundliche Antwort. Beide Antworten sind in Ordnung, dasselbe Konzept nur mit unterschiedlicher Implementierung. Sie können eine weitere Anwendung für Ihre Situation auswählen. Wie du willst.
– PatrickLu-MSFT
10. Februar 2020 um 12:24 Uhr