# Миграция существующего ~/.gitconfig перед тем, как chezmoi подставит managed stub. # # Логика: # 1. Если ~/.gitconfig нет — создаём пустой ~/.gitconfig.local и выходим. # 2. Если ~/.gitconfig уже содержит managed stub — ничего не делаем. # 3. Если ~/.gitconfig.local нет — переносим текущий .gitconfig в .local, # удаляем из .local ключи, которые управляются baseline, и сохраняем бэкап. # 4. Если ~/.gitconfig.local уже есть — просто бэкапим текущий .gitconfig # (chezmoi перезапишет его managed stub-ом). # # Три варианта ManagedStubs — чтобы распознать и текущий формат, # и предыдущие итерации (когда baseline жил в ~/.config/git/config). if (-not ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop')) { return } $GlobalConfig = Join-Path $HOME '.gitconfig' $LocalConfig = Join-Path $HOME '.gitconfig.local' $BackupPath = '{0}.pre-chezmoi.bak-{1}' -f $GlobalConfig, (Get-Date -Format 'yyyyMMdd-HHmmss') # Все исторические варианты managed stub (нормализуются без \r и trim). $ManagedStubs = @( @' [core] autocrlf = false eol = lf quotepath = false longpaths = true [fetch] prune = true [pull] ff = only [init] defaultBranch = main [include] path = ~/.gitconfig.local '@, @' [include] path = ~/.gitconfig.local '@, @' [include] path = ~/.config/git/config [include] path = ~/.gitconfig.local '@ ) # Ключи baseline, которые нужно удалить из .local при миграции. $ManagedKeys = @( 'core.autocrlf', 'core.eol', 'core.quotepath', 'core.longpaths', 'fetch.prune', 'pull.ff', 'init.defaultBranch' ) function Test-IsManagedStub ([string]$Content) { $Norm = ($Content -replace "`r", '').Trim() foreach ($Stub in $ManagedStubs) { if ($Norm -eq ($Stub -replace "`r", '').Trim()) { return $true } } return $false } # ── Основная логика ────────────────────────────────────────────────── # Случай 1: .gitconfig отсутствует — chezmoi создаст его сам. if (-not (Test-Path -LiteralPath $GlobalConfig)) { if (-not (Test-Path -LiteralPath $LocalConfig)) { New-Item -ItemType File -Path $LocalConfig -Force | Out-Null } return } # Случай 2: .gitconfig уже managed — ничего не делаем. $Content = Get-Content -LiteralPath $GlobalConfig -Raw if (Test-IsManagedStub $Content) { if (-not (Test-Path -LiteralPath $LocalConfig)) { New-Item -ItemType File -Path $LocalConfig -Force | Out-Null } return } # Случай 3: .gitconfig.local нет — мигрируем. if (-not (Test-Path -LiteralPath $LocalConfig)) { Copy-Item -LiteralPath $GlobalConfig -Destination $BackupPath -Force Copy-Item -LiteralPath $GlobalConfig -Destination $LocalConfig -Force foreach ($Key in $ManagedKeys) { git config --file $LocalConfig --unset-all $Key 2>$null } Write-Host "Migrated: ~/.gitconfig -> ~/.gitconfig.local" Write-Host "Backup: $BackupPath" return } # Случай 4: .gitconfig.local уже есть — просто бэкапим. Copy-Item -LiteralPath $GlobalConfig -Destination $BackupPath -Force Write-Warning "~/.gitconfig.local already exists; current ~/.gitconfig saved as backup." Write-Host "Backup: $BackupPath"