2015-02-03 15 views
6

Come posso utilizzare GitPython insieme a chiavi SSH specifiche?Chiavi GitPython e SSH?

La documentazione non è molto approfondita su questo argomento. L'unica cosa che ho provato finora è Repo(path).

risposta

7

Si noti che quanto segue funzionerà solo in GitPython v0.3.6 o successivo.

È possibile utilizzare la variabile di ambiente GIT_SSH per fornire un eseguibile a git che chiamerà ssh al suo posto. In questo modo, puoi usare qualsiasi tipo di chiave ssh ogni volta che git prova a connettersi.

Questo funziona sia per chiamata utilizzando un 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() 

... o più persistente utilizzando il metodo del Git oggetto del repository set_environment(...):

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

come si può imposta qualsiasi quantità di variabili d'ambiente, puoi usarne alcune per passare informazioni al tuo ssh-script per aiutarlo a scegliere la chiave ssh desiderata per te.

Ulteriori informazioni sul divenire di questa funzione (novità in GitPython v0.3.6) si trova in the respective issue.

+1

devo ammettere che sto lottando con questo. Preferisco davvero non scrivere uno script SSH personalizzato. C'è un modo per identificare la chiave da usare? Sono new-ish per Python e il tutorial/API non mi sta proprio prendendo dove devo essere per farlo funzionare. Grazie. –

+0

Risulta, a partire da git 2.3, questo è praticamente integrato. Usando il nuovo GIT_SSH_COMMAND, puoi specificare direttamente il comando ssh -i ..., invece di fare affidamento su uno script esterno. – Byron

+1

Grazie. Quanto segue non funziona per me. Cosa mi manca (la formattazione fa schifo nei commenti, ma si spera che tu ne abbia l'idea)? 'con git_project.git.custom_environment (GIT_SSH_COMMAND = 'ssh -i ~/.ssh/id_rsa [email protected]'): git_project.remotes.origin.push (git_project.heads.master)'. Se aggiungo l'opzione '-T' ed eseguo dalla riga di comando, ho effettuato l'accesso come previsto. Problema di formattazione nel mio codice Python? –

4

In seguito ha lavorato per me su 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

Qual è la variabile 'git' in questo esempio? –

+0

Vuoi dire git @? Questo è l'URL del repo, ad esempio [email protected]: django/django.git –

+0

La riga '' con git.custom_environment (GIT_SSH_COMMAND = git_ssh_cmd): '' ... cosa è ** git **? Non esiste alcuna variabile o importazione che definisca git nel tuo snippet di codice. –

Problemi correlati