Tenho uma conta corporativa no GitHub e quero fazer backup de todos os repositórios contidos, levando em consideração qualquer coisa nova que possa ser criada para fins de automação. Eu esperava algo assim:
git clone [email protected]:company/*.git
ou algo semelhante funcionaria, mas não parece gostar do curinga aqui.
Existe uma maneira no Git de clonar e extrair tudo, assumindo que alguém tenha as permissões apropriadas?
Respostas:
Não acho que seja possível fazer dessa forma. Sua melhor aposta é encontrar e percorrer uma lista de repositórios de uma organização usando a API.
Experimente isto:
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
ssh_url
propriedade.git clone
cada um dessesssh_url
s.É um pouco de trabalho extra, mas é necessário que o GitHub tenha a autenticação adequada.
fonte
curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
https://github.com/api/v3/
, tentehttps://api.github.com/
./users/${COMPANY}/repos
caminho em vez de/orgs/${COMPANY}/repos
.access_token
parâmetro de consulta está obsoleto. Se este token estiver sendo usado por um aplicativo sobre o qual você não tem controle, esteja ciente de que ele pode parar de funcionar como resultado desta suspensão de uso.No Windows e em todos os sistemas UNIX / LINUX , usando Git Bash ou qualquer outro Terminal , substitua
YOURUSERNAME
pelo seu nome de usuário e use:CNTX=users
eNAME=yourusername
, para baixar todos os seus repositórios.CNTX=orgs
eNAME=yourorgname
, para baixar todos os repositórios de sua organização.O tamanho máximo da página é 100, então você tem que chamar isso várias vezes com o número da página correto para obter todos os seus repositórios (defina
PAGE
o número da página desejada que deseja baixar).Aqui está um script de shell que faz o acima: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e
fonte
Repositórios de organização
Para clonar todos os repos de sua organização, tente o seguinte shell one-liner:
Repositórios de usuário
Clonando tudo usando URLs de repositório Git:
Clonando tudo usando Clone URL:
Aqui está a função shell útil que pode ser adicionada aos arquivos de inicialização do usuário (usando
curl
+jq
):Repositórios privados
Se precisar clonar os repositórios privados, você pode adicionar token de autorização em seu cabeçalho, como:
ou passe-o no parâmetro (
?access_token=TOKEN
), por exemplo:Notas:
type=private
em sua string de consulta.hub
depois de configurar sua chave API.Veja também:
Dicas :
- Para aumentar a velocidade, defina o número de processos paralelos especificando o
-P
parâmetro paraxargs
(-P4
= 4 processos).- Se você precisar aumentar os limites do GitHub, tente autenticar especificando sua chave de API.
- Adicionar
--recursive
para recursar nos submódulos registrados e atualizar quaisquer submódulos aninhados dentro deles.fonte
Esta essência realiza a tarefa em uma linha na linha de comando:
Substitua
[your_org]
pelo nome da sua organização. E defina o seu,per_page
se necessário.ATUALIZAR:
Como o ATutorMe mencionou, o tamanho máximo da página é 100, de acordo com a documentação do GitHub .
Se você tiver mais de 100 repositórios, terá que adicionar um
page
parâmetro ao seu url e poderá executar o comando para cada página.Nota: o
per_page
parâmetro padrão é30
.fonte
Vá para Configurações da conta -> Aplicativo e crie uma chave de API
Em seguida, insira a chave de API, o URL da instância do github e o nome da organização no script abaixo
Salve isso em um arquivo,
chmod u+x
o arquivo, e execute-o.Agradecimentos a Arnaud pelo código ruby.
fonte
Então, vou adicionar minha resposta também. :) (descobri que é simples)
Buscar lista (usei a empresa "magento"):
Use em
clone_url
vez dissossh_url
para usar o acesso HTTP.Então, vamos clonar todos eles! :)
Se você for buscar repositórios privados - basta adicionar o parâmetro GET
?access_token=YOURTOKEN
fonte
Achei um comentário na essência do @seancdavis fornecido para ser muito útil, especialmente porque, como o autor do pôster original, eu queria sincronizar todos os repositórios para acesso rápido, porém a grande maioria deles eram privados.
Substitua [[NOME DE USUÁRIO]] pelo nome de usuário do github e [[ORGANIZAÇÃO]] pela organização do Github. A saída (metadados do repositório JSON) será passada para um script ruby simples:
fonte
.../orgs/[[organization]]/repos...
para.../users/[[username]]/repos...
. Agora posso importar rapidamente todo o meu trabalho para diferentes máquinas locais. OBRIGADO!Eu fiz um script com Python3 e Github APIv3
https://github.com/muhasturk/gitim
Apenas corra
fonte
Este one-liner do python fará o que você precisa. Isto:
para cada um, faz uma chamada de sistema para
git clone
fonte
fonte
?page=2
.Solução simples:
fonte
Para usá-lo (supondo que você tenha nodejs instalado)
Isso obteria uma lista de todos os repositórios de
wires
e as informações de gravação notest
diretório, usando os detalhes de autorização (usuário / senha) que você fornecer na CLI.Em detalhes,
Na verdade, ele não clona os repositórios, mas, em vez disso, grava um
.txt
arquivo que você pode usarxargs
para fazer a clonagem, por exemplo:Talvez isso seja útil para você; são apenas algumas linhas de JS, então deve ser fácil de ajustar às suas necessidades
fonte
Também existe um módulo npm muito útil para fazer isso. Ele pode não apenas clonar, mas também extrair (para atualizar os dados que você já possui).
Você acabou de criar uma configuração como esta:
e fazer
gitall clone
por exemplo. Ougitall pull
fonte
Caso alguém procure uma solução Windows, aqui está uma pequena função no PowerShell para fazer o truque (poderia ser uma linha / alias, se não o fato de que preciso que funcione com e sem proxy).
fonte
Então, na prática, se você quiser clonar todos os repos da organização
FOO
que correspondemBAR
, você pode usar o one-liner abaixo, que requer utilitários jq e cli comunsfonte
Outro script de shell com comentários que clona todos os repositórios (públicos e privados) de um usuário:
fonte
Crie um alias / função bash em seu
~/.bashrc file
Resolvi isso para minha equipe criando uma função alias / bash em meu
~/.bashrc file
passos
abra um terminal ou shell do Linux e abra o seu
~/.bashrc file
:adicione esta função:
salve e feche seu arquivo ~ / .bashrc e feche o terminal - você precisa fazer isso ou a nova função não inicializará:
abra um novo terminal e experimente:
exemplo : se o seu URL de repositório github pessoal se chama https://github.com/awesome-async, o comando seria
Importante
o
per_page=200
no final da primeira variávelORG_URL
define o número de repositórios que serão clonados, então preste atenção especial a isso:Espero que isto ajude! :)
fonte
...repos?page=${2}&per_page=100";
Você pode obter uma lista dos repositórios usando
curl
e, em seguida, iterar sobre essa lista com um loop bash:fonte
Você pode usar uma ferramenta de código aberto para clonar vários repositórios do github: https://github.com/artiomn/git_cloner
Exemplo:
git_cloner --type github --owner octocat --login user --password user https://my_bitbucket
Use a API JSON de
api.github.com
. Você pode ver o exemplo de código na documentação do github: https://developer.github.com/v3/Ou lá:
https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py
fonte
Para clonar apenas repositórios privados, dada uma chave de acesso, e dado python 3 e módulo de solicitações instalado:
fonte
Uma solução Python3 que inclui paginação exaustiva por meio do
Link
cabeçalho.Pré-requisitos:
pip3 install links-from-link-header
Então, você pode usar
xargs
ou paralelo e:cat repolist | parallel -I% hub clone %
fonte
Se você tiver uma lista de repositórios em uma lista como esta, este script de shell funcionará:
fonte
Criei um script de lote de amostra. Você pode baixar todos os repositórios privados / públicos em github.com. Depois que um repositório é baixado, ele é automaticamente convertido em um arquivo zip.
Observação: o arquivo files.txt deve conter apenas nomes de repositórios como:
fonte
Atualização de 19 de maio
use este comando bash para uma organização (repo privado incluído)
fonte
As respostas predominantes aqui não levam em consideração que a API do Github retornará apenas um máximo de 100 repositórios, apesar do que você pode especificar em
per_page
. Se você estiver clonando uma Github org com mais de 100 repositórios, terá que seguir os links de paginação na resposta da API.Eu escrevi uma ferramenta CLI para fazer exatamente isso :
Isso clonará todos os repositórios da
myorg
organização para o diretório de trabalho atual.fonte
Para organizações às quais você tem acesso com repositórios privados:
Ele usa o
html_url
, então você não precisaaccess_token
apenas inserir sua senha do github quando solicitado.fonte
Clone todos os seus repos que não sejam bifurcações:
Clone seus pontos essenciais:
Este
jq
comando é complexo porque os nomes do repo de gists são hashes, de modo que o comando concatena todos os nomes de arquivos para serem o nome do repoVocê pode filtrar o JSON arbitrariamente usando
jq
instalar:
sudo apt-get install jq
No exemplo acima, eu filtrei garfos usando isto:
curl ... | jq -r 'map(select(.fork == false))' ...
- útil para não clonar repositórios onde você fez solicitações de pull casuaisjq oferece suporte a alguns recursos muito avançados.
man jq
é seu amigoVocê pode autenticar com
curl -u "username" ...
para acessar repositórios privadosURLs da API do Guthub
https://api.github.com/user/repos\?page\=1\&per_page\=100
https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100
Github API Docs para repositórios
fonte
fonte
Para clonar todos os seus próprios repositórios públicos e privados, gere um novo token de acesso com acesso aos repositórios e use:
(substitua por seu próprio token de acesso e nome de usuário)
Isto irá clonar todos os repositórios da pasta atual
Este é um pequeno programa bash, você pode simplesmente colá-lo no terminal e pressionar Enter
fonte