Invio del repository locale al repository remoto utilizzando python Github
Il codice dovrebbe eseguire le seguenti operazioni in ordine:
- Dovrebbe scaricare / clonare il repository Github pubblico in locale.
- Dovrebbe rimuovere tutta la cronologia di git (e i rami)
- Utilizza l'API Github per creare un nuovo repository Github inizializzato con il contenuto del repository Github di input scaricato in locale. Il nuovo repository dovrebbe essere denominato utilizzando il nome fornito. Sono in grado di eseguire i passaggi 1 e 3 ma chiedo di eseguire il login 2 volte . Non sono in grado di inizializzare il nuovo repository remoto con il repository locale. local_repo = repo1 come? E rimuovere la cronologia di git? dove posso trovare la cronologia di git nel repository clonato.
import git,os,tempfile,os,fnmatch,sys
from github import Github
username = sys.argv[1]
password = sys.argv[2]
input_repo_url = sys.argv[3]
output_repo_name = sys.argv[4]
tempdir=tempfile.mkdtemp(prefix="",suffix="")
predictable_filename = "myfile"
saved_umask = os.umask(77)
path = os.path.join(tempdir,predictable_filename)
print("Cloning the repository at "+path)
local_repo = git.Repo.clone_from(input_repo_url,path, branch="master")
print("Clone successful!")
g = Github(username,password)
user = g.get_user()
repo1 = user.create_repo(output_repo_name)
print("New repository created at "+username+" account ")
print(repo1)
target_url = "https://github.com/"+username+"/"+output_repo_name+".git"
print(target_url)
print("Pushing cloned repo to target repo")
local_repo.create_remote("new",url=target_url)
local_repo.git.push("new")
print("Success!!")
Risposte
Campi di autorizzazione ottale
77
probabilmente non è corretto. Quello che hai scritto è 77 in decimale , ma funzionerebbe 115in ottale. Se volessi 077in ottale, dovresti effettivamente scrivere 0o077.
Pathlib
Considera la sostituzione os.pathcon l'uso di pathlib.
Analisi degli argomenti
L' argvanalisi che hai fatto è fragile: fallirà con un'eccezione di indice non valido se l'utente fornisce parametri insufficienti. Considera l'utilizzo argparseinvece.
Inoltre: non chiedere una password come parte di una riga di comando, poiché verrà memorizzata nella cronologia della shell dell'utente. Accettalo da una variabile ambientale, un portafoglio sicuro o da stdin tramite getpass(non input).
Interpolazione di stringhe
"https://github.com/"+username+"/"+output_repo_name+".git"
è più facilmente scritto come
f'https://github.com/{username}/{output_repo_name}.git'
Commenta il tuo codice
Questo è un suggerimento più generale, ma è una buona pratica inserire commenti nel codice per renderlo più leggibile e comprensibile