]> vilimpoc.org git repositories - dotfiles/commit - setup-windows-no-uac.ps1
dotfiles: give git the ssh.exe that pushes at line rate
authorMax Vilimpoc <max@vilimpoc.org>
Fri, 28 Aug 2026 00:04:08 +0000 (02:04 +0200)
committerMax Vilimpoc <max@vilimpoc.org>
Fri, 28 Aug 2026 00:04:08 +0000 (02:04 +0200)
commit2bbc9b414ffb45df936ca1169795cb8e07bb1863
treec33c80ecf1a4f60b7bacc0694d8b0c4e31f6f547
parentb8144088df5abe5fb042890ef5bc8fd72b279b79
dotfiles: give git the ssh.exe that pushes at line rate

core.sshCommand pointed at the in-box System32 client, which reads its stdin
3KB at a time -- the same limit that held an rsync push to ~17MB/s, and it
applies to anything git pushes through it too.  The elevated half now unpacks a
client without that limit beside rsync.exe, so prefer it and keep the in-box one
as the fallback.  Same client from the same source: same ~/.ssh, same ssh-agent
named pipe, same known_hosts.

Candidates are tried by RUNNING them rather than by Test-Path.  The fast build
carries no libcrypto of its own -- it links the one the OpenSSH Client
capability puts in System32 -- so on an image without that capability it is a
file that exists and a binary that will not start, and the next `git push` is a
bad place to discover it.  Two traps in doing that from this script: with
$ErrorActionPreference = 'Stop' a native command's stderr becomes a terminating
error, and `ssh -V` writes its version to stderr, so the WORKING client is the
one that looks broken; and an exe that cannot start never sets $LASTEXITCODE,
leaving the stale 0 from the last native command that did run to read as
success.  Hence the EAP dance and the explicit $global:LASTEXITCODE = $null.

setup-windows.bat runs the elevated half first for this: the fast ssh.exe has to
be on disk before the git config step can prefer it.  The non-elevated half
still runs when the elevated one failed -- nothing in it depends on that half,
and the fallback is the client Windows already has -- and the elevated exit code
is still what the batch file exits with.

Exercised against real binaries under Windows PowerShell 5.1, with
GIT_CONFIG_GLOBAL pointed at a scratch file: fast client present picks
10.0p2, install directory empty falls back to the in-box 9.5p1, a candidate
that exits non-zero and one that cannot start at all both warn and fall back.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D4ozcQcqMSJBi2Ez4Pfxyc
README.md
setup-windows-no-uac.ps1
setup-windows.bat