Como Clonar Somente um Subdiretório com Git ou SVN

No Git já é possível, mas no SVN é bem mais simples.


Como Clonar Somente um Subdiretório com Git ou SVN

Nessa dica vou mostar algo que parece simples (no Git), mas é bem complicadinho! =) Pois, na verdade, eu criei um script Shell Script que você pode rodar como comando na sua $PATH .

Também vou disponibilizar uma solução a mais , mas não do Git e sim do SVN , que pra ser sincero, nem precisaria de uma função Shell, mas pra ficar ainda mais fácil também vou mostrar.

Pra você entender esse artigo você deve possuir conhecimentos básicos de Git e GitHub ou qualquer outro repositório Git.

Para isso recomendo você conhecer nossa paǵina específica para iniciantes em Git e GitHub: https://terminalroot.com.br/git . Lá você vai encontrar dicas em textos e vídeos, inclusive um mini-curso de Git e GitHub para Iniciantes .

Introdução

Em resumo, clonar um repositório significa: copiar todos os arquivos dele para seu computador.

git clone é um utilitário de linha de comando Git que é usado para direcionar um repositório existente e criar um clone ou cópia do repositório de destino. É muito simples para clonar repositórios Git: GitHub , GitLab , BitBucket e entre outros.

O comando resume em:

git clone [repositório]

Por exemplo, eu tenho um repositório que é https://github.com/terroo/fonts , supondo que você deseja clonar esse repositório, o comando seria:

git clone https://github.com/terroo/fonts

Você ainda pode clonar já renomeando e/ou com o mesmo nome em um novo caminho do seu computador, exemplo:

  1. Clona com um novo nome: novas-fonts:
git clone https://github.com/terroo/fonts novas-fonts
  1. Clona com um novo nome dentro do Diretório Downloads:
git clone https://github.com/terroo/fonts Downloas/novas-fontes

Ou até mesmo clonar com o mesmo nome em outro caminho:

git clone https://github.com/terroo/fonts Downloads/fonts

Observação: Se você informar um novo caminho, obrigatóriamente você precisa informar um nome , seja ele o mesmo nome ou um novo. Se você fizer assim, sem informar um nome, ele informará um erro: fatal: destination path 'Downloads' already exists and is not an empty directory. .

Além disso existem diversos parâmetros que você pode usar, aqui veremos alguns, mas você pode obter a documentação completa no site oficial do Git mais especificamente na URL: https://git-scm.com/docs/git-clone .

Clonando um Sub-diretório

Esse repositório que eu usei como exemplo foi totalmente mal projetado, lá você não vai encontrar somente fonts , mas também: Wallpapers, arquivos de configuração para WM e entre outras coisas . E por conta disso, às vezes eu quero copiar somente um sub-diretório dentro dele .

Por exemplo, nesse repositório existe uma pasta/diretório de nome files e vamos supôr que eu queira copiar/clonar somente esse diretório/sub-diretório , se eu fizer isso: git clone https://github.com/terroo/fonts/files não dará certo, o Git não permite isso, haverá falha no comando clone:

marcos@gentoo ~ $ git clone https://github.com/terroo/fonts/files
Cloning into 'files'...
remote: Not Found
fatal: repository 'https://github.com/terroo/fonts/files/' not found
marcos@gentoo ~ $ 

E é bem inconveniente você clonar todo o repositório (que por sinal é bem grande) que vai demorar bastante, somente para usar os arquivos de um diretório específico do repositório.

Até a versão 2.18 do Git isso não era possível, mas a partir da versão 2.19 já é possível, logo verifique a versão do seu Git antes de prosseguir, use o comando git --version para saber a versão. Se for igual ou maior de 2.19 é possível clonar somente um diretório específico.

Para clonar esse diretório (files, dentro do repositório) vamos usar os seguintes comandos, explicação nos comentários (#):

# Criar um diretório, para o Git não ficar bagunçado, e entrar no mesmo 
mkdir meu-dir && cd meu-dir

# Iniciar um repositório Git
git init

# Rastrear o repositório, não informe o subdiretório
git remote add -f origin https://github.com/terroo/fonts/

# Ativar o recurso de verificação em árvore
git config core.sparseCheckout true

# Criar um arquivo no caminho: .git/info/sparse-checkout
# Que esttá dentro do diretório oculto .git que foi criado
# ao rodar o comando: git init
# E dentro dele inserir o nome do sub-diretório que você deseja somente clonar
echo 'files' >> .git/info/sparse-checkout

## Fazer o download com o pull e não com o clone
git pull origin master

Para cada comando , se você não entendeu bem, recomendo você dar uma olhada por cima no manual, por exemplo: man git remote .

Se você acha muito processo rodar todos esse comandos, você pode usar um script em Shell, como eu havia dito para ficar automático e rodar somente um comando, veja o script clicando no link abaixo:

📁 git.dir.sh

Se quiser que vire um comando para usar em qualquer diretório que você estiver, salve com o nome: git-dir (ou o nome que você deseja) e mova pra onde desejar, exemplo:

sudo mv git-dir /usr/local/bin/git-dir
# Ou se você for um fanchato do UNIX: 
# sudo install -D -v git-dir -t /usr/local/bin/git-dir

E pra usar basta rodar git-dir em qualquer lugar que você estiver que o mesmo já mostrará o help exibindo as opções.

Alternativa - Usando o SVN

Pode-se notar que quando usamos o Git pra isso, esse clone , apesar de ser de um subdiretório , ainda assim vai ser muito lento. Para isso existe uma solução bem mais rápida que é o usando o SVN que é uma alternativa ao Git da Apache Software Foundation .

A diferença do SVN para o Git, na minha opinião, se resume nessas duas imagens abaixo, ou seja, não existe melhor e nem pior, existe aquele que atende suas necessidades específicas para cada caso.

Git SVN

O Apache Subversion (também conhecido por SVN) é um sistema de controle de versão desenhado especificamente para ser um substituto moderno do CVS, que se considera ter algumas limitações. O Subversion utiliza banco de dados Berkeley BD.

Antes de tudo , você precisa possuir ele instalado no seu sistema. Para isso use o gerenciador de pacotes da sua distro:

sudo emerge subversion # Gentoo, Funtoo e Portage baseds
sudo apt-get install subversion # Debian, Ubuntu, Linux Mint APT baseds
sudo pacman -S subversion # Arch Linux, Manjaro e PacMan baseds
sudo yum install subversion # Red Hat, CentOS e YUM baseds
sudo dnf install subversion # Fedora

E pra clonar basta usar o parâmetro export com o fake-dir : trunk entre o repositório e o subdiretório, exemplo:

svn export [repository]/trunk/[subdirectory]

Exemplo para o nosso caso:

svn export https://github.com/terroo/fonts/trunk/files

Se quiser que seja seu comando, basta criar um comando ou adicionar essa função ao seu ~/.bashrc:

git-svn(){
  if [[ ! -z "$1" && ! -z "$2" ]]; then
          echo "Iniciando o clone/cópia ..."
          repo=$(echo $1 | sed 's/\/$\|.git$//')
          svn export "$repo/trunk/$2"
  else
          echo "Use: git-svn <repository> <subdirectory>"
  fi  
}

Nesse caso tratei o final do nome do repositório, caso o usuário copie com .git ou com / no final do nome da URL.

E para usar, basta rodar: git-svn [repository] [subdirectory]

Bem mais simples, né ?

Fica à sua escolha qual modo utilizar. Deixe suas dicas/dúvida nos comentários pra gente interagir na solução ou discussão sobre assuntos relacionados!

Abraços!

Compartilhe

Marcos Oliveira

Autor
Marcos Oliveira
Desenvolvedor de Software
youtube.com/TerminalRootTV

Pacote Promocional com Todos os Cursos

Adquira todos os cursos para se tornar um ninja do Terminal e do Linux.

Artigos Relacionados



Comentários