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'