$ErrorActionPreference = "Stop"
$ProgressPreference = 'SilentlyContinue'
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$UtilsScript = Join-Path $ScriptDir "utils.ps1"
. $UtilsScript
function Test-GitInstalled {
$null = Get-Command git -ErrorAction SilentlyContinue
return $?
}
function Install-Git {
Write-Log "INFO" "Starting automatic installation of Git"
$TempDir = Join-Path $env:TEMP "GitInstall"
if (-not (Test-Path $TempDir)) {
New-Item -ItemType Directory -Path $TempDir | Out-Null
}
$InstallerUrl = "https://mirrors.huaweicloud.com/git-for-windows/v2.51.0.windows.1/Git-2.51.0-64-bit.exe"
$InstallerPath = Join-Path $TempDir "Git-2.51.0-64-bit.exe"
Write-Log "INFO" "Downloading Git installer from: $InstallerUrl"
try {
Invoke-WebRequest -Uri $InstallerUrl -OutFile $InstallerPath -UseBasicParsing
Write-Log "SUCCESS" "Git installer downloaded successfully"
} catch {
Write-Log "ERROR" "Failed to download Git installer: $($_.Exception.Message)"
exit 1
}
Write-Log "INFO" "Installing Git silently..."
try {
$Arguments = '/VERYSILENT /NORESTART /NOCANCEL /SP- /SUPPRESSMSGBOXES /COMPONENTS="gitlfs" /DIR="C:\Program Files\Git"'
Start-Process -FilePath $InstallerPath -ArgumentList $Arguments -Wait
Write-Log "SUCCESS" "Git installed successfully"
} catch {
Write-Log "ERROR" "Failed to install Git: $($_.Exception.Message)"
exit 1
}
$GitPath = "C:\Program Files\Git\bin"
$MachinePath = [System.Environment]::GetEnvironmentVariable("PATH", [System.EnvironmentVariableTarget]::Machine)
if ($MachinePath -notlike "*$GitPath*") {
$NewMachinePath = "$MachinePath;$GitPath"
[System.Environment]::SetEnvironmentVariable("PATH", $NewMachinePath, [System.EnvironmentVariableTarget]::Machine)
Write-Log "SUCCESS" "Added Git to system PATH"
}
$GitCmdPath = "C:\Program Files\Git\cmd"
if ($MachinePath -notlike "*$GitCmdPath*") {
$NewMachinePath = "$MachinePath;$GitCmdPath"
[System.Environment]::SetEnvironmentVariable("PATH", $NewMachinePath, [System.EnvironmentVariableTarget]::Machine)
Write-Log "SUCCESS" "Added Git cmd to system PATH"
}
Remove-Item -Path $TempDir -Recurse -Force -ErrorAction SilentlyContinue
$env:PATH = [System.Environment]::GetEnvironmentVariable("PATH", [System.EnvironmentVariableTarget]::Machine) + ";" + [System.Environment]::GetEnvironmentVariable("PATH", [System.EnvironmentVariableTarget]::User)
}
function Verify-Git {
if (Test-GitInstalled) {
$GitVersion = git --version
Write-Log "SUCCESS" "Git is installed, version: $GitVersion"
} else {
Write-Log "ERROR" "Git installation failed, please check manually"
exit 1
}
}
function Apply-ProxyConfig-ForGit {
$ProxyConfigPath = Join-Path $PSScriptRoot "user_config.ps1"
if (-not (Test-Path $ProxyConfigPath)) {
return
}
try {
$ProxyConfigContent = Get-Content -Path $ProxyConfigPath -Raw -Encoding UTF8
} catch {
Write-Log "WARN" "Failed to read proxy config file: $ProxyConfigPath, Error: $($_.Exception.Message)"
return
}
$HTTP_PROXY = ""
$HTTPS_PROXY = ""
$SSL_VERIFY = ""
$ENABLE_GIT_PROXY_CONFIG = "true"
if ($ProxyConfigContent -match '(?m)^\s*\$HTTP_PROXY\s*=\s*["''](.*?)["'']\s*$') { $HTTP_PROXY = $Matches[1] }
if ($ProxyConfigContent -match '(?m)^\s*\$HTTPS_PROXY\s*=\s*["''](.*?)["'']\s*$') { $HTTPS_PROXY = $Matches[1] }
if ($ProxyConfigContent -match '(?m)^\s*\$SSL_VERIFY\s*=\s*["''](.*?)["'']\s*$') { $SSL_VERIFY = $Matches[1] }
if ($ProxyConfigContent -match '(?m)^\s*\$ENABLE_GIT_PROXY_CONFIG\s*=\s*["''](.*?)["'']\s*$') { $ENABLE_GIT_PROXY_CONFIG = $Matches[1] }
$EnableGitProxyConfig = $true
if (-not [string]::IsNullOrWhiteSpace($ENABLE_GIT_PROXY_CONFIG) -and "$ENABLE_GIT_PROXY_CONFIG".Trim() -match '^(?i:false|0|no)$') {
$EnableGitProxyConfig = $false
}
if (-not $EnableGitProxyConfig) {
Write-Log "INFO" "Skip configuring git proxy (ENABLE_GIT_PROXY_CONFIG=$ENABLE_GIT_PROXY_CONFIG)"
return
}
if ($HTTP_PROXY) {
Write-Log "INFO" "Configuring git http.proxy"
& git config --global http.proxy "$HTTP_PROXY"
}
if ($HTTPS_PROXY) {
Write-Log "INFO" "Configuring git https.proxy"
& git config --global https.proxy "$HTTPS_PROXY"
}
if ($SSL_VERIFY -ne $null -and "$SSL_VERIFY".Trim() -ne "") {
Write-Log "INFO" "Configuring git http.sslVerify"
& git config --global http.sslVerify "$SSL_VERIFY"
}
}
Write-Log "INFO" "=== Starting Git Installation Check ==="
if (Test-GitInstalled) {
$GitVersion = git --version
Write-Log "SUCCESS" "Git is installed, version: $GitVersion"
} else {
Write-Log "WARN" "Git is not installed"
Install-Git
Verify-Git
}
Apply-ProxyConfig-ForGit
Write-Log "SUCCESS" "=== Operation Completed ==="
exit 0