Empujar el repositorio local al repositorio remoto usando python Github

Oct 28 2020

El código debe hacer lo siguiente en orden:

  1. Debería descargar / clonar el repositorio público de Github localmente.
  2. Debería eliminar todo el historial de git (y ramas)
  3. Utilice la API de Github para crear un nuevo repositorio de Github inicializado con el contenido del repositorio de github de entrada que descargó localmente. El nuevo repositorio se debe nombrar usando el nombre proporcionado. Puedo realizar los pasos 1 y 3, pero solicito iniciar sesión 2 veces . No puedo inicializar el nuevo repositorio remoto con el repositorio local. local_repo = repo1 ¿cómo? ¿Y eliminar el historial de git? ¿Dónde puedo encontrar el historial de git en el repositorio clonado?
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!!")

Respuestas

2 Reinderien Oct 28 2020 at 05:02

Campos de permiso octal

77

es probable que sea incorrecto. Lo que ha escrito es 77 en decimal , pero esto funcionaría 115en octal. Si quisieras 077en octal, en realidad necesitarías escribir 0o077.

Pathlib

Considere reemplazar os.pathcon el uso de pathlib.

Análisis de argumentos

El argvanálisis que ha realizado es frágil: fallará con una excepción de índice no válido si el usuario proporciona parámetros insuficientes. Considere usar en su argparselugar.

Además: no pida una contraseña como parte de una línea de comando, ya que se almacenará en el historial de shell del usuario. Acéptelo desde una variable de entorno, una billetera segura o desde stdin a través de getpass(not input).

Interpolación de cadenas

"https://github.com/"+username+"/"+output_repo_name+".git"

se escribe más fácilmente como

f'https://github.com/{username}/{output_repo_name}.git'
Dion Oct 28 2020 at 18:44

Comenta tu código

Este es un consejo más general, pero es una muy buena práctica poner comentarios en su código para hacerlo más legible y comprensible.