Ich musste innerhalb des Programms auf das Repository auf Github zugreifen, also habe ich GitPython verwendet. Das meiste davon wurde durch einen Blick auf Tutorial gelöst, aber es wurde beschrieben, weil es einen Teil gab, dessen Ausführung durch Angabe des SSH-Schlüssels einige Zeit in Anspruch nahm. Machen.
In dem Fall, in dem wir an dieser Zeit gearbeitet haben, bestehen die folgenden Annahmen und Anforderungen.
In diesem Fall hängt es von der Umgebung ab, sodass dies nicht unbedingt gesagt werden kann. In vielen Fällen ist der Zugriff auf das Repository von Konto A jedoch problemlos möglich. Konto A ist an den Standard-SSH-Schlüssel (~ / .ssh / id_rsa
) gebunden, und Git verwendet diesen Schlüssel standardmäßig.
Wenn Sie dagegen Konto B verwenden, müssen Sie Git anweisen, "~ / .ssh / id_rsa_new" zu verwenden. Eine Möglichkeit, dies zu tun, besteht darin, ~ / .ssh / config
auf Folgendes zu setzen:
~/.ssh/config
host github-new
user git
hostname github.com
identityfile ~/.ssh/id_rsa_new
identitiesonly yes
Sie können dann den von host
anstelle von github.com (angegeben durch hostname
) angegebenen Wert verwenden, um mit ~ / .ssh / id_rsa_new
darauf zuzugreifen.
~/.ssh/id_rsa_Mit new klonen
$ git clone git@github-new:<AccountB>/<repository>.git
Dies ist in Ordnung, wenn Sie es nur in Ihrer eigenen Umgebung ausführen, dieses Programm jedoch in einer anderen Umgebung als Ihrer eigenen ausgeführt werden muss. Daher ist es besser, es als Laufzeitoption angeben zu können, als es festzulegen.
Git hat Umgebungsvariablen GIT_SSH
und GIT_SSH_COMMAND
( GIT_SSH_COMMAND
ist 2.3 oder höher). Diese können den von Git verwendeten SSH-Befehl angeben. Sie können das Problem lösen, indem Sie im auszuführenden SSH-Befehl dieselben Optionen wie in der obigen Konfigurationsdatei angeben.
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
(Referenz) http://git-scm.com/docs/git#_other
GitPython definiert einen Kontextmanager, der "GIT_SSH", "GIT_SSH_COMMAND" unterstützt.
(Referenz) http://gitpython.readthedocs.org/en/stable/tutorial.html#handling-remotes
Ich konnte nicht davon ausgehen, dass die Git-Version der Ausführungsumgebung 2.3 oder höher ist, also habe ich diesmal GIT_SSH
verwendet.
Da ich den Inhalt des SSH-Schlüssels bereits in den Einstellungen hatte, schrieb ich den Schlüssel und den Befehl in eine Datei und gab ihn an.
GIT mit Git Python_SSH,GIT_SSH_COMMAND
import git
#SSH-Schlüssel exportieren
with open('./id_rsa_tmp', 'w') as f:
f.write('<SSH Key>')
os.chmod('./id_rsa_tmp', 0o600)
#SSH-Befehl exportieren
with open('./ssh_cmd', 'w') as f:
f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')
os.chmod('./ssh_cmd', 0o777)
#Repository-Klon
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')
Bitte beachten Sie, dass Sie sich beim Ausführen von "repo.gitcustom_environment" im Arbeitsverzeichnis des Repositorys befinden.
Im obigen Code befinden sich das geklonte Repository (accountB_repo
), der Schlüssel ( id_rsa_tmp
) und der Befehl (ssh_cmd
) im selben Verzeichnis.
Wenn repo.gitcustom_environment
ausgeführt wird, befindet es sich im Verzeichnis accountB_repo
. Geben Sie daher den Schlüssel und den Befehl bewusst an, dass sie sich im übergeordneten Verzeichnis befinden.
Schlüssel- und Befehlsspezifikation
with open('./ssh_cmd', 'w') as f:
#Der Schlüssel befindet sich im übergeordneten Verzeichnis
f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')
#Der Befehl befindet sich im übergeordneten Verzeichnis
ssh_executable = '../ssh_cmd'
with repo.git.custom_environment(GIT_SSH=ssh_executable):
...
Recommended Posts