Pousser le référentiel local vers le référentiel distant à l'aide de python Github

Oct 28 2020

Le code doit effectuer les opérations suivantes dans l'ordre:

  1. Il devrait télécharger / cloner le référentiel Github public localement.
  2. Il devrait supprimer toute l'historique de git (et les branches)
  3. 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

2 Reinderien Oct 28 2020 at 05:02

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'
Dion Oct 28 2020 at 18:44

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