Pousser le référentiel local vers le référentiel distant à l'aide de python Github
Le code doit effectuer les opérations suivantes dans l'ordre:
- Il devrait télécharger / cloner le référentiel Github public localement.
- Il devrait supprimer toute l'historique de git (et les branches)
- Utilisez l'API Github pour créer un nouveau référentiel Github initialisé avec le contenu du référentiel github d'entrée que vous avez téléchargé localement. Le nouveau référentiel doit être nommé en utilisant le nom fourni. Je suis capable de faire les étapes 1 et 3, mais je demande deux fois de me connecter . Je ne parviens pas à initialiser le nouveau référentiel distant avec le référentiel local. local_repo = repo1 comment? Et supprimer l'historique de git? où puis-je trouver l'historique de git dans le repo cloné.
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!!")
Réponses
Champs d'autorisation octaux
77
est probablement incorrect. Ce que vous avez écrit est 77 en décimal , mais cela fonctionnerait 115en octal. Si vous vouliez 077en octal, vous auriez en fait besoin d'écrire 0o077.
Pathlib
Envisagez de remplacer os.pathpar l'utilisation de pathlib.
Analyse d'argument
L' argvanalyse que vous avez effectuée est fragile - elle échouera avec une exception d'index invalide si l'utilisateur fournit des paramètres insuffisants. Pensez à utiliser à la argparseplace.
Aussi: ne demandez pas de mot de passe dans le cadre d'une ligne de commande, car il sera stocké dans l'historique du shell de l'utilisateur. Acceptez-le depuis une variable d'environnement, un portefeuille sécurisé ou depuis stdin via getpass(not input).
Interpolation de chaîne
"https://github.com/"+username+"/"+output_repo_name+".git"
s'écrit plus facilement comme
f'https://github.com/{username}/{output_repo_name}.git'
Commentez votre code
C'est un conseil plus général, mais il est très bon de mettre des commentaires dans votre code pour le rendre plus lisible et compréhensible