09 maio

Clonando os repositórios do Github

Se você costuma trabalhar com vários computadores, de forma habitual, já deve ter se encontrado clonando os repositórios do Github em cada uma das máquinas, o que pode ser um processo tedioso. mas usando a API do Github isso pode ser resolvido de uma forma muito prática, rápida e automatizada.

Os equipamentos que uso, costumam rodar Windows ou Linux, então sempre opto por criar um alias no bash (do Linux ou do WSL do Windows para simplificar ainda mais o processo.

Claro esse método pressupõe que você use a autenticação por chave SSH no Github, que recomendo fortemente, seja a sua opção. Se ainda não usa, recomendo esse artigo da Carine Batista que explica como usar.

Mas vamos falar da automação então. Como mencionei, ela usa a API do Github para coletar as informações. Se ainda não conhece a API, não deixe de visitar a página oficial, aqui.

Obtendo os dados

Certo, mas então como fazer? O primeiro passo é acessar o Github e coletar todas informações sobre os seus repositórios públicos, o que pode ser realizado através do uso do comando curl e funciona tanto para os repositórios do seu perfil pessoal, como aqueles de sua empresa. Apenas um atributo precisa ser alterado. No comando abaixo, mostro o exemplo para o meu perfil pessoal, mas basta alterar users nele, para orgs, caso deseje os repositórios de sua organização.

curl "https://api.github.com/users/cfprocha/repos"

Porém, não desejamos que essas informações sejam apresentadas na tela, até mesmo porque o comando acima retorna muitas informações, que nem serão úteis para nós, no momento. Então, vamos encaminhar a saída desse comando, para outro, que fará a triagem dos dados, extraindo apenas o que nos interessa. Nesse caso, apenas o link para a clonagem via SSH.

curl "https://api.github.com/users/cfprocha/repos" | grep -e 'ssh_url'

O comando grep vai receber o resultado do primeiro comando e analisar, linha a linha e retornará apenas as linhas que coincidirem com o padrão informado. No nosso caso, apenas as linhas que contiverem ssh_url, porém, ainda não é o que desejamos, pois ele vai repetir a expressão que buscamos e só depois apresentar o url desejado. O que faremos agora, será enviar o resultado desses dois comandos, para um terceiro, usando outro pipe.

curl "https://api.github.com/users/cfprocha/repos" | 
grep -e 'ssh_url' | 
cut -d \" -f 4

Inseri uma quebra de linha, após cada pipe, apenas para facilitar a leitura. Agora, quando o comando cut recebe o resultado dos comandos anteriores, ele separa em campos (fatias seria a tradução mais correta e literal), delimitadas por tabulações. Isso não serviria para nós, portanto usamos a opção -d que altera o delimitador para o que definirmos. Nesse caso, estamos definindo como as aspas. Como bem sabem, não podemos usar aspas diretamente em um comando, senão elas não serão interpretadas, por isso usamos o caractere de escape \ antes delas. Aí resta informar ao cut, qual campo desejamos que ele retorne, através da opção -f, onde definimos que desejamos apenas o quarto campo. Como cheguei nesse número? Analisando o retorno do comando, que era:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0    "ssh_url": "[email protected]:cfprocha/abntex2-FTEC.git",
"ssh_url": "[email protected]:cfprocha/cfprocha.git",
"ssh_url": "[email protected]:cfprocha/distintivos.git",
"ssh_url": "[email protected]:cfprocha/diversos.git",
"ssh_url": "[email protected]:cfprocha/exemplos-fe2.git",
"ssh_url": "[email protected]:cfprocha/gerador-de-perfil.git"

Basta lembrarmos que definimos o delimitador como sendo as aspas, ou seja, definimos que as aspas marcam o final de cada campo. Analisando a primeira linhas temos os campos definidos da seguinte forma (vou colocar números marcando a posição de cada campo):

1 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0    "2 ssh_url"3 : "4 [email protected]:cfprocha/abntex2-FTEC.git"

Fazendo a clonagem

Agora, só nos resta enviar esse resultado para o comando que fará a clonagem desejada, o que obteremos através do uso de outro pipe, para o comando xargs, usando a opção -L1 que serve para informar que o comando deve ser usado para cada linha recebida, seguida de git clone que é o comando em si. Mesmo sendo duas palavras, não precisamos colocar o comando entre aspas. Dessa forma obtemos o comando final, que é:

curl "https://api.github.com/users/cfprocha/repos" | 
grep -e 'ssh_url' | 
cut -d \" -f 4 | 
xargs -L1 git clone

Aí para que tenhamos ele funcionando como um alias, basta editarmos o arquivo .bashrc e inserir no final dele o nome que desejamos para o alias. Tenha um cuidado especial com o uso de aspas e apóstrofes! Fiz um ajuste no comando grep substituindo os apóstrofos, por aspas, para não gerar erro. Depois de inserir esse alias, basta recarregar o bashrc, ou simplesmente, fechar a janela do terminal e abrir novamente. De agora em diante, bastará digitar meusrepos no terminal, que ele clonará todos os seus repositórios públicos.

alias meusrepos='curl "https://api.github.com/users/cfprocha/repos" | grep -e "ssh_url" | cut -d \" -f 4 | xargs -L1 git clone'

Como obter os repositórios privados

O que fazer caso deseje clonar os repositórios privados? Nesse caso a forma mais simples é usar a linha de comando do Github, mais conhecida como Github CLI, que precisa ser previamente instalada. Para Windows, faça o download aqui, já se estiver usando linux dê o comando sudo apt update && sudo apt install gitsome. Depois, para usar, será necessário obter um token no Github, da forma descrita nesse artigo.

Depois que tudo estiver pronto, basta logar na sua conta usando o gh, através do seguinte comando: gh repos (ele apresentará a lista de todos os seus repositórios, mas o que realmente nos interessa é apenas logar no Github). Depois que ele tiver apresentado a lista e você tiver logado, aí basta criar o alias e passar a usar ele. O alias a ser gravado está abaixo e poderá clonar todos os seus repositórios, sejam eles públicos ou privados.

alias todosrepos = 'gh repos | grep -e "cfprocha/" | cut -d / -f 2 | cut -d " " -f 1 | xargs -L1 gh repo clone'
User Avatar
Contador, Analista e Desenvolvedor de Sistemas, com especializações em Contabilidade, Finanças e Análise de Dados, além de mestrado em Contabilidade e Finanças e cursos de extensão em instituições de ensino internacionais, nas áreas financeira e de análise de dados (Yale University, University of Michigan e Johns Hopkins University). Professor Universitário de Graduação em Porto Alegre e Pós-Graduação nas cidades de Porto Alegre, Caxias do Sul, Osório e Miami (USA), palestrante em diversos eventos no Brasil e Estados Unidos, desde 2005. Master Coach Trainer, membro da ICF Brasil e IAC. Já treinou mais de 10.000 pessoas, desde o ano 2.000, no Brasil e nos EUA. Saiba mais na página Sobre.

Leave A Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

quatro + 1 =

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.