Alle Git Repositories von VSTS/TFS sichern
Auch - oder gerade - wenn der Quelltext in der Cloud liegt, schadet es nicht, diesen lokal zu sichern. Mit der TFS REST API und der PowerShell ist dies für alle Git Repositories einer Team Project Collection oder eines Team Projekts sehr einfach möglich.
Voraussetzungen
Voraussetzung zum Zugriff auf die VSTS/TFS REST API aus der PowerShell heraus ist, dass entsprechende Zugriffsdaten vorliegen. Im Fall eines on-premise TFS ist dies in der Regel unproblematisch, weil hierfür der Windows Account verwendet wird.
Für den Zugriff auf die Visual Studio Team Services aus der PowerShell heraus sollte jedoch ein sogenanntes Personal Access Token verwendet werden. Dieses Token ist nur für einen bestimmten Zeitraum gültig und kann jederzeit zurückgerufen werden. Außerdem kann stark eingeschränkt werden, auf welche Daten mit dem Token zugegriffen werden kann. Für das Klonen der Repositories reicht beispielsweise die Code (read) Berechtigung. Daher ist das Ablegen des Tokens in einem Script auch unkritische. Das Erzeugen eines Personal Access Tokens ist unter diesem Link erklärt.
PowerShell Skript
Liegt das Token vor, kann mit dem Aufsetzen des Skripts begonnen werden. Dieses soll zuerst alle Repositories einer Team Project Collection auflisten. Details hierzu sind in der Dokumentation der REST API zu finden. Es kann beispielsweise folgender Request verwendet werden:
GET https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/git/repositories?api-version=1.0
Das folgende Beispielskript liest alle Repositories der Team Project Collection aus. Alternativ können auch die Repositories nur eines Team Projekts ausgelesen werden, indem die URL hinter der Team Project Collection um den Namen des Team Projekts erweitert wird.
Für jedes der Repositories wird der Ordnername in der Form TeamProject.Repository zusammengestellt; falls der Ordner bereits existiert, wird er zunächst gelöscht, um einen sauberen Klon zu erstellen. Dies dauert zwar etwas länger, dafür sind dann aber auch alle Branches des Remote-Repositories enthalten.
Anschließend erfolgt das Klonen des Repositories in den Unterordner als Mirror des Remote-Repositories. Auf diese Weise wird kein Working Tree erzeugt; das direkte Betrachten der Dateien ist also nicht möglich. Für das Backup hat dies den Vorteil, dass beim Kopieren weniger kleine Dateien kopiert werden müssen.
function Backup-Repos ($repos) {
$reposName = $repos.project.name + "." + $repos.name
Write-Output "Creating backup of repository $reposName..."
if (Test-Path $reposName) {
Write-Output "Repository $reposName already exists, removing folder."
Remove-Item $reposName -Recurse -Force
}
$reposUrl = $repos.remoteUrl
Write-Output "Cloning repository $reposName from $reposUrl..."
git clone --mirror "$reposUrl" "$reposName"
}
sl C:\MyBackupFolder
$tfsUrl = "https://fabrikam.visualstudio.com/DefaultCollection"
$user = "MyUser@Account.com"
$password = "MyPersonalAccessToken"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $password)))
$authHeader = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$repositories = Invoke-RestMethod $tfsUrl/_apis/git/repositories?api-version=1.0 -contentType application/json -Headers $authHeader
$repositories.value | ForEach-Object -Process { Backup-Repos $_ }
Dieses Beispiel zeigt das Potential, das in der Kombination der beiden Technologien PowerShell und TFS REST API steckt. Auf diese Weise können viele Aktionen schnell automatisiert werden.