2015-02-03 19 views
6

Wie kann ich GitPython zusammen mit bestimmten SSH-Schlüsseln verwenden?GitPython und SSH-Schlüssel?

Die Dokumentation ist zu diesem Thema nicht sehr gründlich. Das einzige, was ich bisher probiert habe, ist Repo(path).

Antwort

7

Bitte beachten Sie, dass alle folgenden Funktionen nur in GitPython v0.3.6 oder neuer funktionieren.

Sie können die Umgebungsvariable GIT_SSH verwenden, um eine ausführbare Datei für git bereitzustellen, die stattdessen ssh aufruft. Auf diese Weise können Sie jede Art von SSH-Schlüssel verwenden, wenn git versucht, eine Verbindung herzustellen.

Dies funktioniert entweder per Anruf ein mit context manager ...

ssh_executable = os.path.join(rw_dir, 'my_ssh_executable.sh') 
with repo.git.custom_environment(GIT_SSH=ssh_executable): 
    repo.remotes.origin.fetch() 

... oder mehr beharrlich mit der set_environment(...) Methode des Git Objekt Ihrer Repository:

old_env = repo.git.update_environment(GIT_SSH=ssh_executable) 
# If needed, restore the old environment later 
repo.git.update_environment(**old_env) 

Wie können Sie Legen Sie eine beliebige Menge an Umgebungsvariablen fest. Sie können diese verwenden, um Informationen an Ihr ssh-Skript weiterzugeben, damit es den gewünschten ssh-Schlüssel für Sie auswählen kann.

Weitere Informationen über die Entwicklung dieses Features (neu in GitPython v0.3.6) finden Sie unter in the respective issue.

+1

zugeben müssen, gearbeitet, dass ich mit diesem als auch bin zu kämpfen. Ich würde lieber kein eigenes SSH-Skript schreiben. Gibt es eine Möglichkeit, nur den zu verwendenden Schlüssel zu identifizieren? Ich bin neu bei Python und das Tutorial/API bringt mich nicht ganz dahin, wo ich sein muss, damit das funktioniert. Vielen Dank. –

+0

Stellt sich heraus, beginnend mit Git 2.3, das ist ziemlich eingebaut. Mit dem neuen GIT_SSH_COMMAND können Sie den Befehl ssh -i ... jetzt direkt angeben, anstatt sich auf ein externes Skript zu verlassen. – Byron

+1

Danke. Das Folgende funktioniert nicht für mich. Was fehlt mir (Formatierung saugt Kommentare, aber hoffentlich kommst du auf die Idee)? 'mit git_project.git.custom_environment (GIT_SSH_COMMAND = 'ssh -i ~/.ssh/id_rsa [email protected]'): git_project.remotes.origin.push (git_project.heads.master)'. Wenn ich die Option "-T" hinzufüge und über die Befehlszeile ausführe, habe ich mich wie erwartet angemeldet. Formatierungsproblem in meinem Python-Code? –

4

Folge für mich auf gitpython == 2.1.1

import os 
from git import Repo 
from git import Git 

git_ssh_identity_file = os.path.expanduser('~/.ssh/id_rsa') 
git_ssh_cmd = 'ssh -i %s' % git_ssh_identity_file 

with Git().custom_environment(GIT_SSH_COMMAND=git_ssh_cmd): 
    Repo.clone_from('[email protected]', '/path', branch='my-branch') 
+0

Was ist die Variable 'git' in diesem Beispiel? –

+0

Du meinst git @? Das ist die Repo-URL, zum Beispiel [email protected]: django/django.git –

+0

Die Zeile '' mit git.custom_environment (GIT_SSH_COMMAND = git_ssh_cmd): '' ... was ist ** git **? Es gibt keine Variable oder Import, die Git in Ihrem Code-Snippet definiert. –