Skip to content

Instantly share code, notes, and snippets.

@nh43de
Last active January 10, 2023 21:49
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save nh43de/30c8c8c1c2e40d239f6557df81e1f6d2 to your computer and use it in GitHub Desktop.
Save nh43de/30c8c8c1c2e40d239f6557df81e1f6d2 to your computer and use it in GitHub Desktop.
Clone all repos from Azure DevOps using Powershell
<#
--credits to https://blog.rsuter.com/script-to-clone-all-git-repositories-from-your-vsts-collection/
Create a file called "CloneAllRepos.config" in the same directory with
[General]
Url=??
Username=??
Password=??
To execute the script in the Windows or PowerShell command prompt, run the following command:
powershell -ExecutionPolicy Bypass -File ./CloneAllRepos.ps1
If you’d like to execute the script without bypassing the policy in each call, you have to enable script execution globally:
Set-ExecutionPolicy Unrestricted
Now, you can execute the script in the PowerShell command line in this way:
./CloneAllRepos.ps1
#>
# Read configuration file
Get-Content "CloneAllRepos.config" | foreach-object -begin {$h=@{}} -process {
$k = [regex]::split($_,'=');
if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) {
$h.Add($k[0], $k[1])
}
}
$url = $h.Get_Item("Url")
$username = $h.Get_Item("Username")
$password = $h.Get_Item("Password")
# Retrieve list of all repositories
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
$headers = @{
"Authorization" = ("Basic {0}" -f $base64AuthInfo)
"Accept" = "application/json"
}
Add-Type -AssemblyName System.Web
$gitcred = ("{0}:{1}" -f [System.Web.HttpUtility]::UrlEncode($username),$password)
$resp = Invoke-WebRequest -Headers $headers -Uri ("{0}/_apis/git/repositories?api-version=1.0" -f $url)
$json = convertFrom-JSON $resp.Content
# Clone or pull all repositories
$initpath = get-location
foreach ($entry in $json.value) {
$name = $entry.name
Write-Host $name
$url = $entry.remoteUrl -replace "://", ("://{0}@" -f $gitcred)
if(!(Test-Path -Path $name)) {
git clone $url
} else {
set-location $name
git pull
set-location $initpath
}
}
@vernazza
Copy link

It works, but I had to change line 53 to
$url = $entry.webUrl -replace "://", ("://{0}@" -f $gitcred)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment