Inną opcją jest napisanie małego skryptu do wykonania core.sshCommand
go nieco mądrzejszym - sprawdź, czy bieżący katalog roboczy ma skonfigurowany określony klucz SSH, a jeśli tak, użyj go, w przeciwnym razie - polegaj na standardowej rozdzielczości klucza SSH.
Oto moja pierwsza wersja:
#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
ssh "$@"
fi
Następnie skonfiguruj go jako globalne polecenie git SSH:
chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command
( ~/.local/bin
to aktualny standard „umieszczania tutaj skryptów użytkownika” w systemach operacyjnych SystemD )
Po skonfigurowaniu możesz skonfigurować dowolne repozytorium, aby korzystało z określonego klucza SSH, ustawiając opcję konfiguracji ssh.key
:
git config --local ssh.key ~/.ssh/my-non-default-private-key
Dodatkowe opcjonalne sztuczki
- Ustaw globalny
ssh.key
aby mieć „domyślny awaryjny klucz SSH inny niż domyślny” lub coś w tym stylu.
- Ponieważ git jest wykonywany
core.sshCommand
w katalogu głównym repozytorium, twój niestandardowy git-ssh-command
może to sprawdzić i mieć pewne heurystyki dotyczące nazw katalogów. Można to zrobić w else
sekcji, więc heurystyka działa tylko wtedy, gdy nie ma określonego klucza ssh.key
.
- Możesz dodać
git remote -v
czek, aby dodać heurystykę opartą na pilotach, jak w skrypcie Eike
- Jeśli chcesz spojrzeć na piloty repozytorium, ale masz wiele pilotów, które wymagają różnych kluczy, możesz dodać
remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
na początku skryptu, aby rozwiązać problem z pilotem, na którym jest obsługiwany - i porównać z tym ( $remote
wyglądałby jak środkowa kolumna na git remote -v
wyjściu).
Aktualizacja:
Oto wersja niestandardowego polecenia SSH, które sprawdza zdalny adres URL i wykonuje pewne heurystyki - w moim przypadku mam kilka różnych tożsamości z tą samą publiczną usługą hostingu git (jedną do pracy, jedną do celów osobistych itp.) I mogę wybrać poprawną tożsamość, patrząc na zdalny adres URL (sprawdzając grupę Gitlab lub organizację Github itp.):
#!/bin/bash
if [[ "$2" =~ ^git-lfs-authenticate.* ]]; then
remote="$1:$(awk '{print$2}'<<<"$2")"
else
remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
fi
key="$(git config ssh.key)"
if [ -n "$key" ]; then
ssh -o IdentitiesOnly=yes -i "$key" "$@"
elif [[ "$remote" == git@gitlab.com:my-company* ]]; then
ssh -o IdentitiesOnly=yes -i ~/.ssh/company-id "$@"
elif [[ "$remote" =~ git@bitbucket.org:.*other-org.* ]]; then
ssh -o IdentitiesOnly=yes -i ~/.ssh/custom-org-key "$@"
else
ssh "$@"
fi