Como clonar o repositório git apenas alguns diretórios?

13

Por exemplo, eu quero baixar o PCL 3d_rec_framework.

Este é o repositório git do PCL: link

Como baixar este diretório?

link

Eu tentei executar mas não funciona:

sam@sam:~/code/pcl_standalone$ git clone https://github.com/PointCloudLibrary/pcl/tree/master/apps/3d_rec_framework
Cloning into '3d_rec_framework'...
error: The requested URL returned error: 403 while accessing https://github.com/PointCloudLibrary/pcl/tree/master/apps/3d_rec_framework/info/refs
fatal: HTTP request failed
sam@sam:~/code/pcl_standalone$ 

Como fazer o download?

A propósito, eu não quero baixar o git do PCL e remover todos os outros diretórios que eu não quero. É por isso que faço esta pergunta.

Obrigado ~

    
por sam 05.05.2014 / 05:10

3 respostas

5

Você não pode. Com o git, você clona todo o repositório e o histórico completo do repositório.

Existem algumas soluções alternativas para obter um único arquivo de um arquivo git, listado em um Resposta do Stack Exchange para a mesma pergunta , mas você ainda terá que baixar o repositório inteiro para obter aquele único arquivo ou diretório que deseja.

    
por dobey 05.05.2014 / 05:23
28

resposta dobey não é mais o caso desde git v1.7. Agora você pode fazer o checkout de determinadas pastas de um repositório. As instruções completas são encontradas here .

git init <repo>
cd <repo>
git remote add -f origin <url>

git config core.sparseCheckout true

echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout

Isso informa ao git quais diretórios você deseja obter. Então você pode puxar apenas esses diretórios

git pull origin master
    
por skukx 07.07.2015 / 00:02
3

Primeiro, faça:

git clone --depth 1 [repo root] [name of destination directory]

Então:

cd [name of destination directory]

... E por fim:

git filter-branch --prune-empty --subdirectory-filter [path to sub-dir] HEAD

É assim tão fácil. O Git irá reescrever o repositório para que apenas o sub-diretório desejado seja incluído. Isso funciona mesmo se o subdiretório tiver várias camadas de profundidade. Apenas nomeie o diretório de destino como o nome do subdiretório. Então, no comando "git filter-branch", coloque o caminho relativo para o subdiretório. Ah, o --depth 1 diz ao git para baixar apenas o topo da cabeça ( essencialmente removendo o histórico ).

    
por CelticParser 05.02.2016 / 00:25

Tags