How to make QDT work with a private Git repository¶
For now, QDT does not support private Git repositories. It’s a “to be funded” issue. If you’d like to see this feature included in our functional scope, please don’t hesitate to get in touch!
---
title: QDT workflow around a Git private forge (to be funded)
---
flowchart LR
A["QGIS/QDT admin"] <---> |"classic git workflow<br/>clone/pull & git push"| D(("Private Git repository<br/>i.e. git.myorg.com or on GitHub/Lab"))
D --->|"QDT"| F["QGIS end-user<br/>profiles"]
In the meantime, this isn’t a critical limitation, as QDT supports local git repositories, i.e. stored on a network drive. Here comes a diagram illustrating the typical workflow used by most of end-users:
---
title: QDT workflow around a Git private forge (workaround)
---
flowchart LR
A["QGIS/QDT admin"] <---> |"classic git workflow<br/>clone/pull & git push"| D(("Private Git repository<br/>i.e. git.myorg.com or on GitHub/Lab"))
D -->|"Pull<br/>(with deployment token)"| E[["Server on local network<br/>i.e. '//gis/software/qgis/qdt/profiles/'"]]
E --->|"QDT"| F["QGIS end-user<br/>profiles"]
To execute the intermediate git pull, the approach depends on the organization and GIS team habits. This can be done manually through the command-line, with a GUI like the excellent GitHub Desktop or with a script. Below is an example PowerShell script for Windows.
Attention
This script is provided as a sample and may not fully comply with your environment or IT policies. Before implementing in production, take time to review and test it in your environment. If you make improvements or fixes, please share them.
<#
.SYNOPSIS
Clone or update a Git repository to a network location specified through an environment variable.
.DESCRIPTION
This script clones a remote Git repository to a directory specified by an environment variable.
If the repository already exists locally, it performs a `git pull` to update it.
.LICENSE
SPDX-License-Identifier: MIT
#>
# -- VARIABLES --
# Default value if the environment variable is not set
$basePath = if ($env:QDT_LOCAL_CLONE_PROFILES_PATH) { $env:QDT_LOCAL_CLONE_PROFILES_PATH } else { "$env:USERPROFILE\GitRepositories\qdt-qgis-profiles" };
# Remote Git repository URL
$gitRepo = if ($env:QDT_REMOTE_PROFILES_GIT) { $env:QDT_REMOTE_PROFILES_GIT} else { "https://github.com/qgis-deployment/qgis-deployment-toolbelt-cli.git" };
# Target folder for the local repository
$repoName = $gitRepo.Split("/")[-1].Replace(".git", "")
$repoPath = Join-Path -Path $basePath -ChildPath $repoName
# -- FUNCTIONS --
function Test-GitInstalled {
try {
# Check if Git is installed and operational
$gitVersion = git --version 2>&1
if ($gitVersion -match "git version") {
Write-Host "Git is installed: $gitVersion" -ForegroundColor Green
return $true
} else {
Write-Host "Git is installed but not operational." -ForegroundColor Yellow
return $false
}
} catch {
Write-Host "Git is not installed or not found in the PATH." -ForegroundColor Red
return $false
}
}
# -- MAIN --
# Check if Git is installed
if (-not (Test-GitInstalled)) {
Write-Error "Git is required for this script. Please install Git and ensure it is in your PATH."
exit 1
}
# Ensure the base directory exists, create it if necessary
if (-not (Test-Path -Path $basePath)) {
Write-Host "The directory '$basePath' does not exist. Creating it..." -ForegroundColor Yellow
New-Item -ItemType Directory -Path $basePath | Out-Null
}
# Perform git clone or pull
try {
# Check if the repository already exists locally
if (Test-Path -Path $repoPath) {
Write-Host "Repository already exists locally at $repoPath. Performing 'git pull'..." -ForegroundColor Cyan
# Change to the repository directory
Push-Location -Path $repoPath
# Pull the latest changes
git fetch --all
git reset --hard origin/main
# $pullResult = git pull
# Write-Host $pullResult
# Return to the original directory
Pop-Location
} else {
Write-Host "No Git repository identified. Cloning remote repository to $repoPath..." -ForegroundColor Cyan
# Clone the repository
git clone --config remote.origin.pushurl="DISABLED" `
--depth=5 `
$gitRepo `
$repoPath
}
Write-Host "Operation completed successfully!" -ForegroundColor Green
} catch {
Write-Error "An error occurred: $_"
exit 1
}