Envio de repositório local para repositório remoto usando python Github
O código deve fazer o seguinte em ordem:
- Ele deve baixar / clonar o repositório público Github localmente.
- Deve remover todo o histórico do git (e branches)
- Use a API Github para criar um novo repositório Github inicializado com o conteúdo do repositório github de entrada que você baixou localmente. O novo repositório deve ser nomeado usando o nome fornecido. Consigo executar as etapas 1 e 3, mas solicito o login 2 vezes . Não consigo inicializar o novo repo remoto com o repo local. local_repo = repo1 como? E removendo o histórico do git? onde posso encontrar o histórico do git no repositório 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!!")
Respostas
Campos de permissão octal
77
provavelmente está incorreto. O que você escreveu é 77 em decimal , mas isso funcionaria 115em octal. Se você quisesse 077em octal, na verdade precisaria escrever 0o077.
Pathlib
Considere substituir os.pathcom o uso de pathlib.
Análise de argumento
A argvanálise que você fez é frágil - ela falhará com uma exceção de índice inválido se o usuário fornecer parâmetros insuficientes. Considere usar em seu argparselugar.
Além disso: não peça uma senha na linha de comando, pois ela será armazenada no histórico do shell do usuário. Aceite-o de uma variável ambiental, uma carteira segura ou do stdin via getpass(not input).
Interpolação de string
"https://github.com/"+username+"/"+output_repo_name+".git"
é mais facilmente escrito como
f'https://github.com/{username}/{output_repo_name}.git'
Comente o seu código
Esta é uma dica mais geral, mas é uma prática muito boa colocar comentários em seu código para torná-lo mais legível e compreensível