PowerShell-скрипт для установки Git for Windows и базовой настройки Git + SSH для указанного пользователя Windows.
Скрипт рассчитан на запуск на сервере Windows из-под администратора. Он:
- устанавливает Git через
wingetили локальный инсталлятор; - настраивает Git для выбранного пользователя через отдельный
.gitconfig; - принимает SSH private key как параметр;
- копирует закрытый ключ в
%USERPROFILE%\.ssh\id_ed25519; - при возможности автоматически создаёт публичный ключ
id_ed25519.pub; - создаёт или обновляет
%USERPROFILE%\.ssh\config; - при запуске спрашивает имя Git-сервера, если параметр
-GitServerHostне передан; - создаёт отдельный
Host-блок для нужного Git-сервера; - удаляет из пользовательского
.gitconfigстарыйcore.sshCommand, чтобы Git использовал обычный OpenSSH-конфиг пользователя; - ограничивает ACL для
.ssh, ключей,config,known_hostsи.gitconfig.
По умолчанию скрипт выставляет:
user.nameuser.emailinit.defaultBranch=mainfetch.prune=truepull.rebase=trueилиfalse— зависит от параметраpush.default=simplerebase.autoStash=truecore.autocrlf=false— по умолчаниюcredential.helper=manager-core— если не отключено параметром
В %USERPROFILE%\.ssh\config создаётся managed-блок вида:
Host github.com
HostName github.com
User git
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
PreferredAuthentications publickey-Username-GitUserName-GitUserEmail- один из двух:
-SshPrivateKeyPath-SshPrivateKey
-SshPublicKeyPath-SshPublicKey-GitServerHost- если не передать, скрипт спросит его интерактивно
-GitServerSshUser(по умолчаниюgit)-GitHostAlias- если не передать, будет равен
GitServerHost
- если не передать, будет равен
-GitServerPort(по умолчанию22)-InstallMode auto|winget|local|skip-LocalInstallerPath-GitPackageId(по умолчаниюGit.Git)-DefaultBranch(по умолчаниюmain)-PullMode rebase|merge(по умолчаниюrebase)-AutoCrlf false|true|input(по умолчаниюfalse)-EnableCredentialManager-InstallGitLfs-Force- разрешает перезаписать уже существующие
id_ed25519/id_ed25519.pub, если их содержимое отличается
- разрешает перезаписать уже существующие
Set-ExecutionPolicy Bypass -Scope Process -Force
.\setup-windows-git-basic.ps1 `
-Username user-git `
-GitUserName "Alexander" `
-GitUserEmail "alex@example.com" `
-SshPrivateKeyPath C:\user-git\id_ed25519 `
-InstallMode autoСкрипт сам спросит, например:
Enter Git server hostname (for example: gitlab.example.com): github.com
Enter Git SSH username [git]:
.\setup-windows-git-basic.ps1 `
-Username user-git `
-GitUserName "Alexander" `
-GitUserEmail "alex@example.com" `
-SshPrivateKeyPath C:\user-git\id_ed25519 `
-GitServerHost github.com `
-GitServerSshUser git `
-InstallMode auto.\setup-windows-git-basic.ps1 `
-Username user-git `
-GitUserName "Alexander" `
-GitUserEmail "alex@example.com" `
-SshPrivateKeyPath C:\user-git\id_ed25519 `
-GitServerHost github.com `
-GitHostAlias my-gitТогда в .ssh\config получится блок:
Host my-git github.com
HostName github.com
User git
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
PreferredAuthentications publickeyИ можно использовать URL с alias, если захочется.
$priv = Get-Content C:\user-git\id_ed25519 -Raw
.\setup-windows-git-basic.ps1 `
-Username user-git `
-GitUserName "Alexander" `
-GitUserEmail "alex@example.com" `
-SshPrivateKey $priv.\setup-windows-git-basic.ps1 `
-Username user-git `
-GitUserName "Alexander" `
-GitUserEmail "alex@example.com" `
-SshPrivateKeyPath C:\user-git\id_ed25519 `
-Forcegit --version
git config --file "C:\Users\user-git\.gitconfig" --list
type C:\Users\user-git\.ssh\config
type C:\Users\user-git\.ssh\id_ed25519.pubПроверка SSH:
ssh -F "C:\Users\user-git\.ssh\config" -T github.comили, если использован alias:
ssh -F "C:\Users\user-git\.ssh\config" -T my-gitПользователь Windows должен уже существовать. Лучше, если он хотя бы один раз входил в систему, чтобы профиль уже был создан.
Параметр -SshPrivateKeyPath / -SshPrivateKey — это закрытый SSH-ключ, который будет использоваться Git при работе по SSH.
Скрипт всё равно сможет сохранить ключ, но автоматическая генерация .pub из него может не сработать без интерактивного ввода passphrase.
Скрипт создаёт пустой known_hosts, но не добавляет отпечатки удалённых Git-серверов.
Первое подключение по SSH может спросить подтверждение host key.
Скрипт не затирает весь пользовательский config.
Он создаёт или обновляет только свой помеченный блок:
# BEGIN managed by setup-windows-git-basic.ps1 : <alias>
...
# END managed by setup-windows-git-basic.ps1 : <alias>
Это удобно, если у пользователя уже есть другие SSH-хосты.
Обычно:
- Git:
C:\Program Files\Git\ - Git config пользователя:
C:\Users\<Username>\.gitconfig - SSH-ключи:
C:\Users\<Username>\.ssh\ - SSH config:
C:\Users\<Username>\.ssh\config
- Подготовить пользователя Windows.
- Запустить этот скрипт от администратора.
- Передать имя Git-сервера при запуске.
- Добавить публичный ключ на GitLab / GitHub / другой Git-сервер.
- Проверить
ssh -T. - Использовать Git из VS Code Remote SSH.