Faça o download de uma única pasta ou diretório de um repository do GitHub

Como posso baixar apenas uma pasta ou diretório específico de um repository remoto do Git hospedado no GitHub?

Diga que o repository GitHub de exemplo mora aqui:

git@github.com:foobar/Test.git 

Sua estrutura de diretórios:

 Test/ foo/ a.py b.py bar/ c.py d.py 

Eu quero baixar apenas a pasta foo e não clonar todo o projeto de teste.

   

Atualização de setembro de 2016: existem algumas ferramentas criadas pela comunidade que podem fazer isso para você:

  • GitZip (Créditos para Kino – vote sua resposta aqui! )

  • DownGit (Créditos para Minhas Kamal – vota a resposta dele bem aqui! )


O Git não suporta isso, mas o Github faz através do SVN. Se você fizer o checkout do seu código com o subversion, o Github essencialmente converterá o repo de git para subversion no backend, e então servirá o diretório requisitado.

Veja como você pode usar esse recurso para baixar uma pasta específica. Vou usar o popular lodash biblioteca javascript como exemplo.

  1. Obtenha o URL do repo . Primeiro, copie o URL do repository do Github para sua área de transferência. Exemplo de URL de repo do github

  2. Modifique o URL para subversão . Quero fazer o download da pasta em /docs da ramificação master , por isso adicionarei o trunk/docs . URL completo agora é https://github.com/lodash/lodash/trunk/docs . Veja minha nota abaixo para uma explicação mais detalhada sobre por que devemos usar este formato de URL.

  3. Baixe a pasta . Vá para a linha de comando e pegue a pasta com o SVN. svn checkout https://github.com/lodash/lodash/trunk/docs

Você pode não ver nenhuma atividade imediatamente porque o Github leva até 30 segundos para converter repositorys maiores, portanto seja paciente.

Explicação do formato de URL completo:

  • Se você estiver interessado em ramificação master , use o trunk . Então o caminho completo é trunk/foldername
  • Se você estiver interessado em foo branch, use branches/foo . O caminho completo se parece com branches/foo/foldername
  • Protip: Você pode usar o svn ls para ver tags e branches disponíveis antes de fazer o download, se desejar

Isso é tudo! O Github também suporta mais resources de subversão , incluindo suporte para commit e push de alterações.

Duas opções para este recurso:

Opção 1: extensões do navegador

Extensão do Chrome , Firefox Addon

Uso:

  1. Em qualquer página de reposições do GitHub.
  2. Basta clicar duas vezes nos itens que você precisa.
  3. Clique no botão de download no canto inferior direito.
  4. Veja o painel de progresso e aguarde o download do acionador do navegador.
  5. Obtenha o arquivo ZIP.

Obter token:

  1. Clique no ícone GitZip Extension no seu navegador.
  2. Clique no link “Normal” ou “Particular” além de “Obter Token”.
  3. Autorize a permissão do GitZip na página de autenticação do Github.
  4. Voltar à página de reporte do começo.
  5. Continue a usar.

Opção 2: Github gh-page

http://kinolien.github.io/gitzip usando as bibliotecas GitHub API e JSZip, FileSaver.js.

Passo 1: insira o URL do github para o campo no canto superior direito.
Passo 2: Pressione enter ou clique em download para download zip diretamente ou clique em pesquisa para ver a lista de subpastas e arquivos.
Passo 3: Clique no botão “Download Zip File” ou “Get File” para obter arquivos.

Na maioria dos casos, funciona bem, exceto que a pasta contém mais de 1.000 arquivos, devido à limitação da API do Github Trees. (refere-se ao conteúdo da API do Github )

E também pode suportar repositorys privados / públicos e atualizar o limite de taxa, se você tiver uma conta do GitHub e usar o link “obter token” neste site.

Vá para DownGit > Digite seu URL> Download!

Agora, você pode fazer o DOWNLOAD DIRETO ou criar DOWNLOAD LINK para qualquer diretório ou arquivo público do GitHub ( especialmente grandes arquivos ) do DownGit ! Aqui está uma demonstração simples


DownGit


Você também pode configurar o uso detalhado da propriedade do arquivo baixado.

Se você tiver o svn , você pode usar o svn export para fazer isto:

 svn export https://github.com/foobar/Test.git/trunk/foo 

Observe o formato da URL:

  • O URL base é https://github.com/
  • /trunk acrescentado no final

Antes de executar o svn export , é bom primeiro verificar o conteúdo do diretório com:

 svn ls https://github.com/foobar/Test.git/trunk/foo 

Para um Repo Generic git:

Se você deseja baixar arquivos, não clonar o repository com histórico, você pode fazer isso com o git-archive .

git-archive faz um git-archive compactado zip ou tar de um repository git. Algumas coisas que tornam isso especial:

  1. Você pode escolher quais arquivos ou diretórios no repository git arquivar.
  2. Ele não arquiva a pasta .git/ ou nenhum arquivo não rastreado no repository em que é executado.
  3. Você pode arquivar um branch, tag ou commit específico. Os projetos gerenciados com o git geralmente usam isso para gerar arquivos de versões do projeto (versão beta, versão 2.0, etc.) para os usuários fazerem o download.

Um exemplo de criação de um arquivo do diretório docs/usage partir de um repository remoto ao qual você está conectado com o ssh:

 # in terminal $ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tgz 

Mais informações nesta postagem do blog e na documentação do git .

Nota sobre o GitHub Repos:

O GitHub não permite access ao git-archive . ☹️

Eu criei um projeto de código aberto, chamado GitHubFolderDownloader . Ele permite que você baixe uma única pasta de um repository sem clonar ou baixar todo o repository.

Nada de errado com outras respostas, mas eu pensei em compartilhar instruções passo-a-passo para aqueles que passavam por este processo pela primeira vez.

Como baixar uma única pasta de um repository github (Mac OS X):

~ Para abrir o Terminal basta clicar em spotlight e digitar terminal e apertar enter

  1. Em um Mac você provavelmente já tem o SVN (para testar basta abrir o terminal e digitar “svn” ou “qual svn” ~ sem as aspas)
  2. No Github: Localize o caminho do Github para sua pasta git (não o repository) clicando no nome da pasta específica dentro de um repo
  3. Copie o caminho da barra de endereços do navegador
  4. Abra o Terminal e digite: svn export
  5. Em seguida, cole no endereço (por exemplo): https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. Substitua as palavras: tree / mestre
  7. com a palavra: tronco
  8. Digite a pasta de destino dos arquivos (neste exemplo, armazeno a pasta de destino dentro da pasta Downloads do usuário atual)
  9. Aqui espaço é apenas a barra de espaço não a palavra (espaço) ~ / Downloads / HeadsUpUI
  10. O comando terminal final mostra o comando completo para fazer o download da pasta (compare o endereço com o passo 5) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~ / Downloads / HeadsUpUI

BTW – Se você está no Windows ou em alguma outra plataforma, você pode encontrar um download binário do subversion (svn) em http://subversion.apache.org

~ Se você quiser fazer o checkout da pasta ao invés de simplesmente baixá-la tente usar o comando svn help (tldr: replace export with checkout )

Atualizar

Quanto ao comentário sobre retomar um download / checkout interrompido. Eu tentaria executar o svn cleanup seguido por svn update . Por favor, procure por opções adicionais.

Você não pode; diferentemente do Subversion, onde cada subdiretório pode ser verificado individualmente, o Git opera em uma base de repository completo.

Para projetos em que o access mais refinado é necessário, você pode usar submódulos – cada submódulo é um projeto separado do Git e, portanto, pode ser clonado individualmente.

É concebível que um front-end do Git (por exemplo, a interface web do GitHub, ou gitweb) possa fornecer uma interface para você extrair uma determinada pasta, mas que eu saiba que nenhum deles faz isso (embora eles permitam que você baixe arquivos individuais) , portanto, se a pasta não contém muitos arquivos, essa é uma opção)

Edit – GitHub realmente oferece access via SVN, o que permitiria que você fizesse exatamente isso (como por comentário). Veja https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away para obter as instruções mais recentes sobre como fazer isso

Se você realmente quer apenas “baixar” a pasta e não “clonar” (para desenvolvimento), a maneira mais fácil de simplesmente obter uma cópia da versão mais recente do repository (e, portanto, uma pasta / arquivo dentro dele), sem precisar clonar o repository inteiro ou mesmo instalar o git em primeiro lugar, é fazer o download de um arquivo zip (para qualquer repository, fork, branch, commit, etc.) acessando o repository / fork / branch / commit desejado no GitHub (por exemplo, http(s)://github.com///commit/ para uma cópia dos arquivos como estavam após uma confirmação específica) e selecionando o botão Downloads próximo à parte superior direita .

Este formato de arquivo não contém nenhuma mágica do git-repo, apenas os arquivos rastreados (e talvez alguns arquivos .gitignore se eles foram rastreados, mas você pode ignorá-los: p) – isso significa que se o código mudar e você quiser Fique por dentro, você terá que baixar novamente manualmente, e isso também significa que você não poderá usá-lo como um repository git …

Não tenho certeza se é isso que você está procurando neste caso (novamente, “download” / view vs “clone” / develop), mas pode ser útil mesmo assim …

1. Clique neste link http://kinolien.github.io/gitzip/
2.Pasta o link da pasta do Github que você deseja baixar.
3.Clique em Pesquisar, ele mostrará todos os arquivos para download.
Nota: -Usando a pesquisa, não há necessidade de inserir a chave do token;) … mantenha-a simples (y)

Quem está trabalhando na pasta específica, ele precisa clonar essa pasta em si, por isso, siga as etapas abaixo ** — usando SPARSE CHECKOUT — **

Etapa 1: crie um diretório.

Passo 2: Inicialize um repository Git. ( git init )

Etapa 3: ative os checkouts esparsos. ( git config core.sparsecheckout true )

Passo 4: Diga ao Git quais diretórios você quer (echo 2015 / brand / May (consulte a pasta que você quer trabalhar) >> .git/info/sparse-checkout )

Passo 5: Adicione o controle remoto ( git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git )

Etapa final 6: Buscar os arquivos ( git pull origin master )

Outro exemplo específico:

Como eu quero baixar a pasta ‘iOS Pro Geo’ da url

https://github.com/alokc83/APRESS-Books-Source-Code-/ tree / master /% 20Pro% 20iOS% 20Geo

e eu posso fazer isso via

 svn checkout https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo 

Observe o tronco no caminho

Editado: (de acordo com o comentário de Tommie C)

Sim, usar exportar em vez de fazer checkout forneceria uma cópia limpa sem arquivos de repository git extras.

 svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo 

Editado: Se a tree / mestre não estiver lá na url, bifurque-a e ela estará lá na URL bifurcada.

É um dos poucos lugares onde o SVN é melhor que o Git.

No final, gravitamos em direção a três opções:

  1. Use o wget para pegar os dados do GitHub (usando a visualização de arquivos brutos).
  2. Faça com que os projetos upstream publiquem o subdataset necessários como artefatos de construção.
  3. Desista e use o checkout completo. É um grande sucesso na primeira compilation, mas a menos que você consiga muito tráfego, não é muito trabalhoso nas construções a seguir.

Apenas para ampliar as respostas acima, um exemplo real de um repository real do GitHub para um diretório local seria:

 svn ls https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces svn export https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces /temp/SvnExport/Washburn 

Às vezes, um exemplo concreto ajuda a esclarecer as substituições propostas.

Você pode fazer um download simples da tree de diretórios:

 git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf - 

Mas se você pretende dar uma olhada, e conseguir fazer commits e empurrá-los de volta, não, você não pode fazer isso.

Nossa equipe escreveu um script bash para fazer isso porque não queríamos ter que instalar o SVN em nosso servidor básico.

https://github.com/ojbc/docker/blob/master/java8-karaf3/files/git-download.sh

Ele usa a API do github e pode ser executado a partir da linha de comando assim:

 git-download.sh https://api.github.com/repos/ojbc/main/contents/shared/ojb-certs 

Eu trabalho com servidores CentOS 7 nos quais eu não tenho access root, nem git, svn, etc (nem quero!) Então fiz um script python para baixar qualquer pasta do github: https://github.com/andrrrl/github -pasta-downloader

O uso é simples, basta copiar a parte relevante de um projeto do github, digamos que o projeto seja https://github.com/MaxCDN/php-maxcdn/ , e você quer uma pasta onde alguns arquivos de origem sejam apenas, então você precisa faça algo como:

$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(irá criar pasta de destino, se não existir)

Requer biblioteca lxml , pode ser instalada com o easy_install lxml
Se você não tem access root (como eu), você pode criar um arquivo .pydistutils.py em seu diretório $HOME com estes conteúdos: [install] user=1 E o easy_install lxml irá funcionar (ref: https: // stackoverflow com / a / 33464597/591257 ).

Eu uso linux assim, coloque isso em ~ / .bashrc, chamado mesmo: D $ HOME / .bashrc

 git-dowloadfolder(){ a="$1" svn checkout ${a/tree\/master/trunk} } 

em seguida, atualize o shell com

 source ~/.bashrc 

então use-o com git-downloadfolder blablabla: D

Se você precisar fazer isso programaticamente e não quiser confiar no SVN, você pode usar a API do GitHub para baixar todo o conteúdo de forma recursiva.

Para inspiração, aqui está o meu ruby ​​gist: https://gist.github.com/cvengros/b2a7e82f66519d423b6f

Para exportar um diretório do GitHub, substitua “/ tree / master /” na url do diretório por “/ trunk /”.

Por exemplo, para exportar o diretório da seguinte URL:

 https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet 

execute o seguinte comando:

 svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet 

Existe um pacote pip do Python3 chamado githubdl que pode fazer isso *:

 export GIT_TOKEN=1234567890123456789012345678901234567890123 pip install githubdl githubdl -u http://github.com/foobar/test -d foo 

* Disclaimer: Eu escrevi este pacote.

Se o directoy que você deseja baixar for uma biblioteca separada, é melhor criar um outro repository git e, em seguida, usar a function submódulo git.

Claro, você tem que ser o dono do repo inicial que você quer

Eu escrevi uma ferramenta com o Node.js apenas para isso. Confira Repo Dir

instalar com npm i -g dl-repo-dir e comando repo estarão disponíveis globalmente.

baixar e renomear um diretório em um repository

repo download aztack/download-repo-dir lib src/lib/new-name

baixe um repository

repo download aztack/download-repo-dir '' src/lib/download-repo-dir

baixar de um repository gitlab privado com tag dada

export GITLAB_API_PRIVATE_TOKEN=YOUR_TOKEN_HERE

repo download gitlab:mygitlab.com:topgroup/subgroup/repo#v1.0.0 dir src/lib/new-name

e haverá um arquivo repo.json para salvar todas as informações.

Em um novo projeto, você pode inicializar o projeto com o repo.json usando o comando repo init .

Nenhuma das respostas ajudou na minha situação. Se você está desenvolvendo para o Windows, você provavelmente não tem svn. Em muitas situações, não é possível contar com usuários que tenham o Git instalado, ou não querem baixar repositorys inteiros por outras razões. Algumas das pessoas que responderam a essa pergunta, como Willem van Ketwich e aztack, fizeram ferramentas para realizar essa tarefa. No entanto, se a ferramenta não for escrita para o idioma que você está usando ou se você não quiser instalar uma biblioteca de terceiros, isso não funcionará.

No entanto, existe uma maneira muito mais fácil. O GitHub tem uma API que permite baixar um único arquivo ou o conteúdo de um diretório inteiro usando solicitações GET . Você pode acessar um diretório usando https://api.github.com/repos/:owner/:repo_name/contents/:path que retorna um object JSON enumerando todos os arquivos no diretório. Incluído na enumeração é um link para o conteúdo bruto do arquivo, o parâmetro download_url . O arquivo pode ser baixado usando esse URL.

É um processo de duas etapas que requer a capacidade de fazer solicitações GET, mas isso pode ser implementado em praticamente qualquer idioma, em qualquer plataforma. Pode ser usado para obter arquivos ou diretórios.

Se você está confortável com comandos unix, você não precisa de dependencies especiais ou aplicativos da web para isso. Você pode baixar o repository como um tarball e descompactar apenas o que você precisa.

Exemplo (arquivos woff2 de um subdiretório no fontawesome):

 curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3 
  • Mais sobre o formato do link: https://developer.github.com/v3/repos/contents/#get-archive-link (incluindo como obter um arquivo zip ou ramificações / referências específicas)
  • Mantenha a parte inicial do caminho ( */ ) para corresponder a qualquer diretório. O Github cria um diretório wrapper com o commit ref no nome, então não pode ser conhecido.
  • Você provavelmente desejará que --strip-components sejam os mesmos que a quantidade de barras ( / ) no caminho (argumento anterior).

Isso fará o download do tarball inteiro. Use o método SVN mencionado nas outras respostas se isso tiver que ser evitado ou se você quiser ser gentil com os servidores do GitHub.