Como posso baixar apenas uma pasta ou diretório específico de um repositório Git remoto hospedado no GitHub?
Digamos que o exemplo do repositório GitHub mora aqui:
[email protected]:foobar/Test.git
Sua estrutura de diretórios:
Test/
├── foo/
│ ├── a.py
│ └── b.py
└── bar/
├── c.py
└── d.py
Quero baixar apenas a pasta foo e não clonar todo o projeto de teste.
Respostas:
Atualização em setembro de 2016: existem algumas ferramentas criadas pela comunidade que podem fazer isso por você:
O Git não suporta isso, mas o Github via SVN. Se você fizer o checkout do seu código com o subversion, o Github basicamente converterá o repositório do git para o subversion no back-end, servindo o diretório solicitado.
Veja como você pode usar esse recurso para baixar uma pasta específica. Vou usar a popular biblioteca javascript
lodash
como exemplo.Navegue até a pasta que deseja baixar . Vamos fazer o download
/test
damaster
filial.Modifique a URL para subversão . Substitua
tree/master
portrunk
.https://github.com/lodash/lodash/tree/master/test
➜https://github.com/lodash/lodash/trunk/test
Baixar a pasta . Vá para a linha de comando e pegue a pasta com SVN.
Você pode não ver nenhuma atividade imediatamente, porque o Github leva até 30 segundos para converter repositórios maiores, portanto, seja paciente.
Isso é tudo! O Github também suporta mais recursos de subversão , incluindo suporte para confirmar e enviar alterações.
fonte
tree/master
portrunk
e você pode obter a pasta específica.tree/master
comtrunk
. Esta informação deve ser adicionada em resposta.svn export
, pois não queria uma cópia de trabalho do Subversion. Então eu adicionei a pasta resultante no Git. (De alguma forma, perdi uma grande parte da minha árvore de diretórios, então exportei dobranch
caminho parabranches
, o que acho correto; caso contrário, vá em frente e troque de volta.Duas opções para esse recurso:
Opção 1: extensão do navegador GitZip
Uso:
Obter token:
Opção 2: Github gh-page
Etapa 1: insira o URL do github no campo no canto superior direito.
Etapa 2: pressione enter ou clique em download para zip de download diretamente ou clique em pesquisar para exibir a lista de subpastas e arquivos.
Passo 3: Clique em "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 oferecer suporte a repositórios públicos / privados e atualizar o limite de taxa, se você tiver uma conta do GitHub e usar o link "obter token" neste site.
fonte
Vá para DownGit > Digite seu URL> Download!
Agora, você pode BAIXAR DIRETAMENTE ou criar LINK DE DOWNLOAD para qualquer diretório ou arquivo público do GitHub (arquivo especialmente grande ) do DownGit ! Aqui está uma demonstração simples -
Você também pode configurar o uso detalhado da propriedade do arquivo baixado .
fonte
downloaded 25 of 25 files
quando tento fazer o download desta URL: github.com/dssg/hitchhikers-guide/tree/master/curriculum/…Se você tiver
svn
, podesvn export
fazer isso:Observe o formato do URL:
https://github.com/
/trunk
anexado no finalAntes de executar
svn export
, é bom verificar primeiro o conteúdo do diretório com:fonte
.git
extensão. Você pode usar o link completo do projeto e começar usandosvn ls
seguido pelo caminho completo do projeto. Exemplo:svn ls https://github.com/RobTillaart/Arduino.git
. Para exportar apenas uma pasta, basta adicionar o/trunk
seguido pelo caminho desejado, comosvn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib
. É mais fácil manter o caminho do projeto intacto.https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi
, executesvn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi
. Um diretório chamadowsgi
será criado no diretório de trabalho atual. Apenas arquivos de origem, nada mais. Não.git
, não há arquivos relacionados ao subversion.Para um repositório genérico do git:
Se você deseja baixar arquivos, não clonar o repositório com histórico, você pode fazer isso com
git-archive
.git-archive
cria um arquivo compactado zip ou tar de um repositório git. Algumas coisas que o tornam especial:.git/
pasta ou nenhum arquivo não rastreado no repositório em que é executado.Um exemplo de criação de um arquivo morto do
docs/usage
diretório a partir de um repositório remoto ao qual você está conectado com o ssh:Mais informações nesta postagem do blog e na documentação do git .
Nota sobre os repositórios do GitHub:
O GitHub não permite
git-archive
acesso . ☹️fonte
git archive --format tar
O formato não é tar.gz, mas tar.Eu criei um projeto de código aberto, chamado GitHubFolderDownloader . Permite baixar uma única pasta de um repositório sem clonar ou baixar o repositório inteiro.
fonte
Não há nada de errado com outras respostas, mas pensei em compartilhar instruções passo a passo para aqueles que vagam por esse processo pela primeira vez.
Como baixar uma única pasta de um repositório do github (Mac OS X):
BTW - Se você estiver no Windows ou em alguma outra plataforma, poderá encontrar um download binário do subversion (svn) em http://subversion.apache.org
Atualizar
Sobre o comentário sobre a retomada de um download / checkout interrompido. Eu tentaria correr
svn cleanup
seguido porsvn update
. Por favor, pesquise SO para opções adicionais.fonte
Quem estiver trabalhando em uma pasta específica, precisará clonar a própria pasta em particular. Para isso, siga as etapas abaixo usando a verificação esparsa.
Crie um diretório
Inicialize um repositório Git. (
git init
)Ativar verificações esparsas. (
git config core.sparsecheckout true
)Diga ao Git quais diretórios você deseja (eco 2015 / brand / May (consulte a pasta na qual você deseja trabalhar) >>
.git/info/sparse-checkout
)Adicione o controle remoto (
git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git
)Busque os arquivos (
git pull origin master
)fonte
Você não pode; Diferentemente do Subversion, onde cada subdiretório pode ser retirado individualmente, o Git opera com base em todo o repositório.
Para projetos em que o acesso mais refinado é necessário, você pode usar submódulos - cada submódulo é um projeto Git separado e, portanto, pode ser clonado individualmente.
É concebível que um front-end do Git (por exemplo, a interface da web do GitHub ou gitweb) possa optar por fornecer uma interface para você extrair uma determinada pasta, mas que eu saiba, nenhum deles faz isso (embora eles permitam baixar arquivos individuais , portanto, se a pasta não contiver muitos arquivos, isso é uma opção)
Editar - o GitHub realmente oferece acesso via SVN, o que permitiria fazer exatamente isso (conforme comentário). Consulte https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away para obter instruções mais recentes sobre como fazer isso
fonte
Se você realmente deseja apenas "baixar" a pasta e não "cloná- la " (para desenvolvimento), a maneira mais fácil de obter uma cópia da versão mais recente do repositório (e, portanto, de uma pasta / arquivo), sem a necessidade de clonar o repositório inteiro ou instalar o git em primeiro lugar, é fazer o download de um arquivo zip (para qualquer repositório, bifurcação, ramificação, confirmação, etc.) acessando o repositório desejado / fork / branch / commit no GitHub (por exemplo,
http(s)://github.com/<user>/<repo>/commit/<Sha1>
para uma cópia dos arquivos como estavam após uma confirmação específica) e selecionar oDownloads
botão próximo ao canto superior direito.Esse 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 for alterado e você desejar fique por dentro, você terá que fazer o download novamente manualmente, e também significa que você não poderá usá-lo como um repositório git ...
Não tenho certeza se é isso que você está procurando neste caso (novamente, "download" / view vs "clone" / develop), mas ainda assim pode ser útil ...
fonte
tar.gz
:https://github.com/${owner}/${repo}/archive/${hash}.tar.gz
2019 Resumo
Existem várias maneiras de lidar com isso, dependendo se você deseja ou não fazer isso manual ou programaticamente.
Existem quatro opções resumidas abaixo. E para aqueles que preferem uma explicação mais prática, montei um vídeo do YouTube: Baixe arquivos e pastas individuais do GitHub .
Também publiquei uma resposta semelhante no StackOverflow para aqueles que precisam baixar arquivos únicos do GitHub (em vez de pastas).
1. Interface de usuário do GitHub
2. Ferramentas de terceiros
https://github.com/babel/babel-eslint/tree/master/lib
) e pressionar o botão "Download".3. Subversão
svn export https://github.com/babel/babel-eslint/trunk/lib
e pressione enter.4. API do GitHub
https://api.github.com/repos/:owner/:repo/contents/:path
. Depois de substituir os espaços reservados, um exemplo de terminal é:https://api.github.com/repos/babel/babel-eslint/contents/lib
. Isso fornece dados JSON para todo o conteúdo existente nessa pasta. Os dados têm tudo o que você precisa, incluindo se o conteúdo é ou não uma pasta ou arquivo, um URL de download, se for um arquivo, e um ponto de extremidade da API, se for uma pasta (para que você possa obter os dados dessa pasta). Usando esses dados, o script pode percorrer recursivamente todo o conteúdo da pasta de destino, criar pastas para pastas aninhadas e baixar todos os arquivos de cada pasta. Confira o código do DownGit para se inspirar.fonte
Outro exemplo específico:
Como eu quero baixar a pasta 'iOS Pro Geo' a partir do URL
https://github.com/alokc83/APRESS-Books-Source-Code-/ tree / master /% 20Pro% 20iOS% 20Geo
e eu posso fazer isso via
Observe o tronco no caminho
Editado: (conforme comentário de Tommie C)
Sim, usar a exportação em vez do checkout daria uma cópia limpa sem arquivos extras do repositório git.
Editado: se a árvore / mestre não estiver no URL, bifurque-o e ele estará lá no URL bifurcado.
fonte
Existe um pacote pip Python3 chamado
githubdl
que pode fazer isso *:A página do projeto está aqui
* Aviso: eu escrevi este pacote.
fonte
É um dos poucos lugares onde o SVN é melhor que o Git.
No final, gravitamos em direção a três opções:
fonte
Se você se sente confortável com os comandos unix, não precisa de dependências especiais ou aplicativos da web para isso. Você pode fazer o download do repositório como um tarball e descompactar apenas o necessário.
Exemplo (arquivos woff2 de um subdiretório em fontawesome):
*/
) para corresponder a qualquer diretório. O Github cria um diretório de wrapper com o commit ref no nome, portanto ele não pode ser conhecido.--strip-components
ser igual à quantidade de barras (/
) no caminho (argumento anterior).Isso fará o download do pacote completo. Use o método SVN mencionado nas outras respostas se isso tiver que ser evitado ou se você quiser ser legal com os servidores GitHub.
fonte
Você pode fazer um download simples da árvore de diretórios:
Mas se você quiser dar uma olhada e conseguir fazer commit e empurrá-los de volta, não, não pode fazer isso.
fonte
Apenas para amplificar as respostas acima, um exemplo real de um repositório GitHub real para um diretório local seria:
Às vezes, um exemplo concreto ajuda a esclarecer as substituições propostas.
fonte
Nenhuma das respostas ajudou na minha situação. Se você está desenvolvendo para o Windows, provavelmente não possui o svn. Em muitas situações, não é possível contar com os usuários para que o Git esteja instalado ou não desejar baixar repositórios inteiros por outros motivos. Algumas das pessoas que responderam a essa pergunta, como Willem van Ketwich e aztack, criaram ferramentas para realizar essa tarefa. No entanto, se a ferramenta não foi escrita para o idioma que você está usando ou se não deseja instalar uma biblioteca de terceiros, elas não funcionam.
No entanto, existe uma maneira muito mais fácil. O GitHub possui 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 objeto JSON enumerando todos os arquivos no diretório Incluído na enumeração, há um link para o conteúdo bruto do arquivo, odownload_url
parâmetro 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.
fonte
Nossa equipe escreveu um script bash para fazer isso porque não queríamos instalar o SVN em nosso servidor bare bones.
https://github.com/ojbc/docker/blob/master/java8-karaf3/files/git-download.sh
Ele usa a API do github e pode ser executado na linha de comando da seguinte maneira:
fonte
Eu uso o linux, coloque isso em ~ / .bashrc, chamado even: D $ HOME / .bashrc
atualize o shell com
use-o com o git-downloadfolder blablabla: D
fonte
Eu trabalho com servidores CentOS 7 nos quais não tenho acesso root, nem git, svn, etc (nem quero!), Então criei um script python para baixar qualquer pasta do github: https://github.com/andrrrl/github -folder-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ê deseja uma pasta em que apenas alguns arquivos de origem sejam necessários, é necessário faça algo como:
$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(criará a pasta de destino se não existir)
Requer biblioteca lxml , pode ser instalado com
easy_install lxml
Se você não tiver acesso root (como eu), poderá criar um
.pydistutils.py
arquivo no seu$HOME
diretório com o seguinte conteúdo:[install] user=1
Eeasy_install lxml
funcionará apenas (ref: https://stackoverflow.com/a/ 33464597/591257 ).fonte
Apenas 5 etapas a seguir
fonte
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:
execute o seguinte comando:
fonte
Uma resposta direta a isso é primeiro tortoise svn a partir do link a seguir.
durante a instalação, ative a opção CLI, para que possa ser usada na interface da linha de comandos.
copie o link do subdiretório git hub.
substituir árvore / mestre por tronco
e fazer
os arquivos serão baixados para a pasta deeplab no diretório atual.
fonte
você pode usar o git svn da seguinte maneira.
Dessa forma, você não precisa se preocupar em definir o svn, especificamente para usuários do Windows.
fonte
sudo apt install git-svn
é necessário ao executar o WSL.Se você precisar fazer isso de forma programática e não quiser confiar no SVN, poderá usar a API do GitHub para baixar todo o conteúdo recursivamente.
Para inspiração, aqui está a minha essência do ruby: https://gist.github.com/cvengros/b2a7e82f66519d423b6f
fonte
Use esta função, o primeiro argumento é o URL da pasta, o segundo é o local para o qual a pasta será baixada:
fonte
git clone --filter
do Git 2.19Essa opção realmente ignora a busca de objetos desnecessários do servidor:
O servidor deve ser configurado com:
Foi feita uma extensão ao protocolo remoto Git para suportar esse recurso na v2.19.0, mas não há suporte para o servidor no momento. Mas já pode ser testado localmente.
Eu cobri isso com mais detalhes em: Como clonar um subdiretório apenas de um repositório Git?
fonte
Por qualquer motivo, a
svn
solução não funciona para mim e, como não preciso desvn
mais nada, não fazia sentido gastar tempo tentando fazê-lo, então procurei uma solução simples usando as ferramentas que já possuía. Este script usa apenascurl
eawk
para baixar todos os arquivos em um diretório do GitHub descrito como"/:user:repo/contents/:path"
.O corpo retornado de uma chamada para o
"GET /repos/:user:repo/contents/:path"
comando API REST do GitHub retorna um objeto que inclui um"download_url"
link para cada arquivo em um diretório.Esse script de linha de comando chama a API REST usando
curl
e envia o resultado por meio do AWK, que filtra todas as linhas, exceto as "download_url", apaga aspas e vírgulas dos links e baixa os links usando outra chamada para curl.fonte
git sparse-checkout
Exemplo com versão atual :
Mais notavelmente
--sparse
verifica apenas os arquivos de diretório de nível superior dogit
repositório na cópia de trabalhogit sparse-checkout add t
adiciona / verifica incrementalmente at
subpasta degit
Outros elementos
git sparse-checkout init
faz alguns preparativos para permitir checkouts parciais--filter=blob:none
otimiza a busca de dados baixando apenas os objetos git necessários (veja o recurso de clone parcial para obter mais informações)--cone
também acelera o desempenho aplicando padrões de inclusão de arquivo mais restritosStatus do GitHub
fonte