Ich habe 2 Git-Server, die 2 verschiedene SSH-Schlüssel benötigen.
git clone user1@server1:blahblahblah
verwendet ~/.ssh/id_rsa
, aber ich muss angeben, welcher Schlüssel verwendet werden soll, abhängig von dem Server, zu dem ich eine Verbindung herstelle.
Welcher Git-Befehlszeilenparameter erledigt diesen Job? (Ich verwende Linux.)
Antworten:
Wenn Sie eine Verbindung über SSH herstellen, wird der Schlüssel von einem SSH-Parameter und nicht von einem Git-Parameter gesteuert.
SSH sucht in der
~/.ssh/config
Datei nach Konfigurationsparametern. Ändern Sie diese Datei und fügen Sie IdentityFile-Einträge für die beiden Git-Server wie folgt hinzu:Dieser Artikel enthält einige weitere Details.
quelle
ssh-agent
und verwendenssh-add
und dann einfach verwenden. Wenn git über ssh eine Verbindung herstellt, ist der Schlüssel bereits aktiviert. Sie sehen, es gibt verschiedene Möglichkeiten, und Ihre ursprüngliche Antwort hilft einfach nicht wirklich.Es gibt noch eine andere Möglichkeit. Das ist zu setzen
core.sshCommand
, zBEs gibt ein bestimmtes Szenario, in dem diese Strategie besonders nützlich ist: Wenn Sie mehrere Konten bei Github haben, wie alle Konten
ssh
bei Github as,[email protected]
und derssh
Schlüssel verwendet, um zu bestimmen, welcher Github-Benutzer Sie sind. In diesem Fall wird.ssh/config
undssh-agent
wird weder das getan, was Sie wollen.Update - Sie können die oben genannten Schritte erst ausführen, wenn Sie über ein lokales Repository verfügen. Wenn Sie also versuchen, ein Remote-Repository zu klonen, müssen Sie den Schlüssel gemäß der Antwort von drawbie18 manuell angeben:
Sobald Sie das Repository geklont haben, können Sie den
git config
Befehl verwenden, um dies dauerhaft festzulegen.quelle
git init
ein Repo erstellen, es lokal so konfigurieren, dass der richtige ssh-Befehl verwendet wird, und dann eine Fernbedienung hinzufügen (3 Schritte, verglichen mit nur 1 mit "git clone").Im Allgemeinen möchten Sie
~/.ssh/config
dies verwenden. Koppeln Sie einfach die Serveradressen wie folgt mit den Schlüsseln, die Sie für sie verwenden möchten:Host *
bezeichnet einen beliebigen Server, daher verwende ich ihn~/.ssh/id_rsa
als Standardschlüssel.quelle
In meinem Szenario, ähnlich wie im @ Richard Smith-Szenario (dessen Lösung übrigens für mich nicht funktioniert hat), muss ich verschiedene Schlüssel für denselben Server unter verschiedenen Repositorys verwenden.
Die Problemumgehung für mich bestand darin, die Sitzung mit der Umgebungsvariablen
GIT_SSH_COMMAND
wie folgt korrekt einzurichten :Aktualisieren :
Eine andere Sache, die hier zu beachten ist, ist, dass das korrekte Einstellen der Umgebungsvariablen ein Problem sein kann. Daher verwende ich die Änderungsfunktionen der Eingabeaufforderung, die von Dingen wie Liquid Prompt oder Fish Shell bereitgestellt werden, um sich in die Shell einzuhaken und die Umgebungsvariablen entsprechend der zu aktualisieren aktuelles Verzeichnis und einige Regeln. Beispielsweise befinden sich alle meine persönlichen Projekte, die für meinen persönlichen SSH-Schlüssel mit Gitlab erforderlich sind, unter.
~/Documents/Projects/personal
Wenn der Shell-Hook ausgeführt wirdpwd
und feststellt, dass sich das aktuelle Verzeichnis unter diesem Pfad befindet, werden dieGIT_SSH_COMMAND
Variablen automatisch nach Bedarf festgelegt.quelle
Verwenden Sie
ssh-add path-to-private-key
es funktioniert sofort.quelle
Sie können die Konfiguration --global oder --local festlegen, global aktualisiert die
~/.gitconfig
Datei, local aktualisiert die Konfiguration im Repository.git/config
und überschreibt die globale Konfiguration (~ / .gitconfig)quelle
Windows-Benutzer hier, ich bin gerade auf dieses Problem gestoßen und habe eine etwas andere Lösung als ich hier bisher gelesen habe. Das Problem, mit dem ich konfrontiert war, war, dass ich einfach ein Repo mit einem bestimmten privaten SSH-Schlüssel klonen wollte und meine Git-Konfiguration nicht global konfigurieren oder bestimmte Git-Bash-Einstellungen hinzufügen musste, während ich meine Arbeit in PowerShell erledige. Im Wesentlichen möchte ich nur einige private Schlüssel in meinem .ssh-Ordner haben und verweise sie nach Bedarf in bestimmten Repos.
Der folgende Befehl funktioniert hierfür:
Im Wesentlichen wird dabei bei der Initialisierung des Git-Repos die Option core.sshCommand festgelegt, bevor der Klon ausgeführt wird. Der spezifische SSH-Schlüssel, den Sie für dieses Repo verwenden möchten, wird NUR für dieses Repo festgelegt. Dies ist möglicherweise nicht für alle Fälle eine ideale Lösung, aber für das, was ich will.
quelle
-c
Option nicht bewusstgit clone
. Dies ist besser als das Einstellen der Umgebung, wie ich beim Klonen vorschlage.Die anderen Antworten haben mich dazu inspiriert, ein kleines Skript zu schreiben, das den ssh-Schlüssel abhängig von den Befehlszeilenoptionen oder (falls vorhanden) den Werten von git remote -v auswählt. Ich hoffe es hilft!
Um die Frage tatsächlich zu beantworten: Verwenden Sie gat.
Siehe auch https://bitbucket.org/eikerobert/gat/src/master/
#!/bin/bash usegat=false for VAR in "$@" do if [ "$VAR" != "${VAR/[email protected]:myaccount/}" ]; then usegat=true fi done if [ $usegat=false ]; then /usr/bin/git rev-parse --is-inside-work-tree >/dev/null 2>&1 isinsidegitrepo=$? #echo $isinsidegitrepo if [ $isinsidegitrepo = 0 ]; then remote=`/usr/bin/git remote -v` if [ "$remote" != "${remote/[email protected]:myaccount/}" ]; then usegat=true fi fi fi if [ $usegat = true ]; then # echo "TRUE" /usr/bin/git -c core.sshCommand="/usr/bin/ssh -i /home/myaccount/.ssh/mykey" "$@" else #echo "FALSE" /usr/bin/git "$@" fi
quelle
Eine andere Möglichkeit besteht darin, ein kleines Skript zu schreiben
core.sshCommand
ein bisschen intelligenter Überprüfen Sie, ob im aktuellen Arbeitsverzeichnis ein bestimmter SSH-Schlüssel konfiguriert ist, und verwenden Sie ihn andernfalls. Verwenden Sie die Standardauflösung für den SSH-Schlüssel.Hier ist meine erste Version:
#!/bin/bash key="$(git config ssh.key)" if [ -n "$key" ]; then ssh -o IdentitiesOnly=yes -i "$key" "$@" else ssh "$@" fi
Richten Sie es dann als globalen git SSH-Befehl ein:
(
~/.local/bin
ist der aktuelle Standard für "Benutzerskripte hier platzieren" auf SystemD-Betriebssystemen )Nachdem Sie dies eingerichtet haben, können Sie jedes Repository für die Verwendung eines bestimmten SSH-Schlüssels konfigurieren, indem Sie die Konfigurationsoption festlegen
ssh.key
:Zusätzliche optionale Tricks
ssh.key
Einstellung so ein, dass sie einen "Standard-Fallback auf einen nicht standardmäßigen SSH-Schlüssel" oder ähnliches aufweist.core.sshCommand
im Stammverzeichnis des Repositorys ausgeführt wird, kann Ihr Benutzergit-ssh-command
dies überprüfen und einige Heuristiken zu Verzeichnisnamen haben. Dies kann in diesemelse
Abschnitt erfolgen, sodass Heuristiken nur dann aktiviert werden, wenn kein spezifischer Schlüssel vorhanden istssh.key
.git remote -v
Check hinzufügen , um Heuristiken basierend auf den Fernbedienungen hinzuzufügen, wie in Eikes Skriptremote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
am Anfang des Skripts hinzufügen , um die Fernbedienung aufzulösen, mit der gearbeitet wird - und dies überprüfen ($remote
würde wie die mittlere Spalte in dergit remote -v
Ausgabe aussehen ).quelle