J'avais besoin d'accéder au dépôt sur Github depuis le programme, j'ai donc utilisé GitPython. La plus grande partie a été résolue en regardant Tutoriel, mais elle a été décrite car il y avait une partie qui prenait un certain temps à fonctionner en spécifiant la clé SSH. Faire.
Dans le cas sur lequel nous avons travaillé cette fois, les hypothèses et exigences suivantes existent.
Dans ce cas, cela dépend de l'environnement, donc cela ne peut pas être dit sans condition, mais dans de nombreux cas, il n'y a pas de problème pour accéder au référentiel du compte A. Le compte A est lié à la clé SSH par défaut (~ / .ssh / id_rsa
), et Git utilise cette clé par défaut.
D'un autre côté, si vous utilisez le compte B, vous devez dire à Git d'utiliser ~ / .ssh / id_rsa_new
. Une façon de faire est de définir ~ / .ssh / config
sur:
~/.ssh/config
host github-new
user git
hostname github.com
identityfile ~/.ssh/id_rsa_new
identitiesonly yes
Vous pouvez ensuite utiliser la valeur spécifiée par host
au lieu de github.com (spécifié par hostname
) pour y accéder en utilisant ~ / .ssh / id_rsa_new
.
~/.ssh/id_rsa_Cloner en utilisant un nouveau
$ git clone git@github-new:<AccountB>/<repository>.git
Cela convient si vous l'exécutez simplement dans votre propre environnement, mais que ce programme doit s'exécuter dans un environnement autre que le vôtre. Par conséquent, il est préférable de pouvoir le spécifier comme option d'exécution plutôt que de le définir.
Git a des variables d'environnement GIT_SSH
et GIT_SSH_COMMAND
( GIT_SSH_COMMAND
est 2.3 ou plus récent). Ceux-ci peuvent spécifier la commande SSH utilisée par Git. Vous pouvez résoudre le problème en spécifiant les mêmes options que le fichier de configuration ci-dessus dans la commande SSH à exécuter.
GIT_SSH,GIT_SSH_COMMAND
# GIT_SSH
$ GIT_SSH='~/ssh_cmd' git push origin master
$ cat ~/ssh_cmd
ssh -i ~/.ssh/id_rsa_new -oIdentitiesOnly=yes "$@"
# GIT_SSH_COMMAND
$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa_new -oIdentitiesOnly=yes' git push origin master
(Référence) http://git-scm.com/docs/git#_other
GitPython définit un gestionnaire de contexte qui prend en charge GIT_SSH
, GIT_SSH_COMMAND
.
(Référence) http://gitpython.readthedocs.org/en/stable/tutorial.html#handling-remotes
Je ne pouvais pas supposer que la version Git de l'environnement d'exécution était 2.3 ou supérieure, j'ai donc utilisé GIT_SSH
cette fois.
De plus, comme j'avais déjà le contenu de la clé SSH dans les paramètres, j'ai écrit la clé et la commande dans un fichier et je l'ai spécifié.
GIT avec Git Python_SSH,GIT_SSH_COMMAND
import git
#Exporter la clé SSH
with open('./id_rsa_tmp', 'w') as f:
f.write('<SSH Key>')
os.chmod('./id_rsa_tmp', 0o600)
#Exporter la commande SSH
with open('./ssh_cmd', 'w') as f:
f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')
os.chmod('./ssh_cmd', 0o777)
#Clone du référentiel
repo = git.Repo.clone_from('accountB_repo')
#Repository Push
ssh_executable = '../ssh_cmd'
with repo.git.custom_environment(GIT_SSH=ssh_executable):
repo.remote().push('master')
Notez que lorsque vous exécutez repo.gitcustom_environment
, vous vous trouvez dans le répertoire de travail du référentiel.
Dans le code ci-dessus, le référentiel cloné (ʻaccountB_repo), la clé (ʻid_rsa_tmp
) et la commande (ssh_cmd
) sont dans le même répertoire.
Lorsque repo.gitcustom_environment
est exécuté, il se trouve dans le répertoire ʻaccountB_repo`, alors spécifiez la clé et la commande tout en sachant qu'elles sont dans le répertoire parent.
Spécification des touches et des commandes
with open('./ssh_cmd', 'w') as f:
#La clé se trouve dans le répertoire parent
f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')
#La commande se trouve dans le répertoire parent
ssh_executable = '../ssh_cmd'
with repo.git.custom_environment(GIT_SSH=ssh_executable):
...
Recommended Posts