Dominando o git bundle

Diego Malone
Dec 24, 2018 · 4 min read

Se você já esteve sem acesso ao repositório do projeto em que está trabalhando, pode já ter tido problemas para atualizar seu repositório local do git ou enviar seus commits para o resto do time.

Uma solução que geralmente vem à nossa mente é criar um arquivo zip do projeto e enviar para seu time subir no repositório online ou pedir pra alguém enviar um zip com os últimos commits para você ficar com seu código atualizado. Essa abordagem pode funcionar, mas tem algumas limitações:

  • Para projetos grandes, um zip do projeto pode ser pesado demais para ficar mandando pra lá e pra cá o tempo todo;
  • Os arquivos que estão no .gitignore serão enviados junto com os arquivos do repositório;
  • Quando você enviar o seu trabalho para alguém subir no repositório, quem for subir terá que criar um novo repositório só para dar o push dos seus commits, e depois dar pull no seu repositório para aí sim ficar com o código atualizado;
  • Se você quiser receber os últimos commits do repositório online e já tiver feito algum commit no seu repositório local, você pode não conseguir juntar as duas bases num projeto só, o que pode dar bastante dor de cabeça.

É para situações como essas que existe o comando git bundle. De acordo com a documentação oficial, o git bundle existe para trabalhar com repositórios que não possuem uma ligação direta, por exemplo se o seu computador não tiver acesso à internet ou ao repositório online. Através deste comando, é possível gerar uma cópia de uma branch específica (ou até de um repositório inteiro) em um arquivo que pode ser enviado para seu time.


Gerando um bundle com o projeto completo

Para usar de exemplo, criei um projeto de app Android seguindo o tutorial do Android Studio. O projeto é bem simples, mas já tem 20 MB quando enviado em um arquivo zip.

A primeira opção do bundle é gerar um arquivo com tudo que tem na sua branch principal, no nosso caso só temos a master. O comando é git bundle create <nome do arquivo> <branch>.

Ou até mesmo com todas as branches do seu repositório local.

Esse comando irá criar um arquivo meuapp.bundle no seu diretório do projeto. No caso de um app simples de Android, o arquivo criado tem apenas 127 KB, muito menos que o arquivo zip da pasta, que tinha 20 MB. Isso acontece porque o arquivo bundle contém apenas os arquivos do projeto, sem os arquivos criados que estão no .gitignore.

É possível verificar um arquivo bundle gerado. Para isso basta rodar o comando git bundle verify <arquivo> dentro do diretório do repositório:

Agora é só enviar o arquivo para alguém do seu time, que ainda não tenha o repositório local, fazer o clone do arquivo bundle através do comando git clone -b <branch> <arquivo> <diretório destino>.

E para verificar que está tudo certo, podemos ver no log que todos os commits do repositório inicial estão lá.

Pronto, o novo repositório foi criado em outra máquina mesmo sem o acesso necessário na mesma.

OBS: Ao criar um repositório dessa forma, o remote da branch é o arquivo bundle. Se em algum momento for necessário efetuar push ou pull do repositório online, podemos alterar o remote do repositório.


Enviando uma nova branch

Agora que todos já possuem o repositório local, pode ocorrer de um integrante do time desenvolver uma nova feature e precisar enviar para o repositório online. Para isso, podemos criar um bundle com a nova branch criada apenas localmente.

Agora enviando o arquivo pra alguém do time, essa pessoa pode fazer o fetch do seu bundle com o comando git fetch <arquivo> <branch origem>:<branch destino>.

OBS: Você também pode fazer pull do bundle, mas para isso você primeiro deve criar a branch que irá receber os commits enviados.

Para enviar os commits para o repositório online, basta entrar na branch criada e fazer um push.


Enviando os últimos commits

Podemos também enviar apenas os últimos commits para alguém que esteja trabalhando na mesma branch. Para isso precisamos descobrir quais commits dessa branch precisamos enviar, e podemos fazer isso de diversas formas. Podemos, por exemplo, definir o número de commits que queremos enviar. No exemplo abaixo, enviamos os últimos 2 commits.

Também podemos descobrir qual o último commit do repositório de quem irá receber o bundle e criar um arquivo com todos os commits desde o último commit em comum. Podemos utilizar o comando git log para obter a lista de commits e tags do repositório.

Agora podemos criar um bundle com todos os commits desde um commit específico.

Ou desde uma tag específica:

Com o subcomando verify podemos obter qual o commit necessário para alguém poder obter esse bundle.


Conclusão

Apesar de não ser muito utilizado, o comando git bundle pode ser muito útil para atualizar seu repositório local sem ter acesso ao repositório online.

Se você gostou desse artigo, não deixe de clicar no 👏 abaixo. Feedbacks são muito bem vindos.

Diego Malone

Written by

Android Developer

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade