Muitas vezes nosso projeto vai tomando corpo e começamos a criar subdiretórios com novos grupos de arquivos úteis, mas ai descobrimos que estes mesmos arquivos são uteis para diversos projetos e precisamos multiplica-los, como mante-los atualizados em todos os projetos?

A melhor forma de se manter um grupo de arquivos atualizado em todos os projetos é transforma-los em uma biblioteca e instala-los no diretório apropriado de bibliotecas, seja do Arduino ou de outra IDE de desenvolvimeto que esteja usando, isso vai variar muito com o ToolKit que estiver usando para desenvolvimento.

Vamos de vagar, apenas vamos considerar que temos vários projetos, e compartilhamos os mesmos arquivos entre eles, e não queremos ainda transformar este grupo de arquivos numa bibliotéca. Portando se você já estiver usando o GIT e quiser preservar a histórico de amadureccimento do seu código, você pode transformar este diretório em um submodulo.

O primeiro passo

Copie a pasta do seu projeto para uma basta de backup que será seu ambiente de trabalho temporário. Entre nesta pasta de trabalho e remova do git as referencias aos repositórios remotos, fazendo assim você evita qualquer erro.

cp -r meu-projeto-base meu-projeto-base-bck
cd meu-projeto-base-bck

Removendo referências aos repositórios originais

$ git remote -v
=> origin git@github.com:arduinominas/meu-projeto-base

No exemplo acima nosso projeto apontava apenas para arduinominas/meu-projeto-base no GitHub, que é o origin de nosso projeto, então removemos esta referência.

$ git remote remove origin

Filtrando o diretório que será o novo sub-módulo

$ git filter-branch --subdirectory-filter apoio/arquivos-compartilhados HEAD -- --all
$ git reset --hard
$ git gc --aggressive
$ git prune

Com os comando acima você removeu do log do git todos os demais diretórios e manteve apenas informações relativas ao diretório apoio/aquivos-compartilhados.

envie para o servidor o novo sub-módulo

Você precisa ter no GitHub ou outro servidor de repositórios um repositório vazio já criado e com acesso para você gravar nele os novos arquivos, vamos supor que seja “arduinominas/arquivos-compartilhados”

$ git remote add origin git@github.com:arduinominas/arquivos-compartilhados

Agora adicione qualquer alteração que tenha feita e faça o commit normalmente.

$ git add suas alteracoes
$ git commit

E agora envie seu novo repositório para o servidor.

$ git push origin master

Voltemos ao projeto original e adicionemos o novo repositório

$ cd ../meu-projeto-base

Lembrando que você estava no diretório do projeto de trabalho meu-porjeto-base-bck.

Primeiro vamos remover o diretório antigo

$ git rm -rf apoio/aquivos-compartilhados

Você pode fazer o commit deste passo para manter o histório do que está fazendo.

Atenção use o comando git rm -r para remover recursivamente o diretório, e use o -f para forçar esta remoção, tenha certeza do que está fazendo.

Adicione ao projeto original o novo sub-módulo

Vamos então adicionar o novo sub-módulo com o comando:

$ git submodule add git@github.com:arduinominas/arquivos-compartilhados.git apoio/aquivos-compartilhados

Observe que o novo sub-módulo vai ficar no mesmo diretório que os arquivos ficavam antes, portanto você não terá que fazer alterações em seu código.

Agora inicialize e atualize o sub-módulo com o material que está no servidor:

$ git submodule init
$ git submodule update

E finalize adicionando ao histórico do git o novo sub-módulo para que fique registrado no servidor.

$ git add .gitmodules apoio/arquivos-compartilhados
$ git commit -m "Novos submodulos adicionados referente a pasta de arquivos compartilhados"

Conclusão

Como vimos o processo é muito simples quando se conhece os comandos certos, em grandes projetos o tempo de espera é grande, mas o que precisa ser feito é muito pouco, e você pode fazer isso para todas as pastas que deseja reaproveitar em outros projetos, pode até usar como um template (um modelo) para as pastas mais usadas.

Mas lembre-se há mecanismos mais adequados para se usar com bibliotecas, procure se informar sobre eles no manual da linguagem, do ToolKit/Framework e/ou IDE que usa.


Carlos Delfino

Escrito por:

Desenvolvedor e consultor para projetos com Microcontroladores e Mobile

Google LinkedIn Digg Reddit StumbleUpon

Atualizado em