Disclaimer: o título é ligeiramente hiperbólico, existem outras soluções comprovadas para o problema. Eu acho a técnica abaixo muito elegante, no entanto.
Recentemente eu li sobre esta técnica incrível em um tópico Hacker News sobre as soluções das pessoas para armazenar seus arquivos de pontos. O usuário StreakyCobra
mostrou sua elegante configuração e … Fazia tanto sentido! Eu estou no processo de mudar o meu próprio sistema para a mesma técnica. O único pré-requisito é instalar Git.
Em suas palavras a técnica abaixo requer:
Sem ferramentas extras, sem links simbólicos, os arquivos são rastreados em um sistema de controle de versão, você pode usar ramificações diferentes para computadores diferentes, você pode replicar sua configuração facilmente em uma nova instalação.
A técnica consiste em armazenar um repositório Git bare em uma pasta “lateral” (como $HOME/.cfg
ou $HOME/.myconfig
) usando um alias especialmente criado para que os comandos sejam executados contra esse repositório e não contra o usual .git
pasta local, o que interferiria com quaisquer outros repositórios Git ao redor.
Começando do zero
Se você não tem rastreado suas configurações em um repositório Git antes, você pode começar usando esta técnica facilmente com estas linhas:
git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
- A primeira linha cria uma pasta
~/.cfg
que é um repositório Git nu que irá rastrear nossos arquivos. - Então criamos um alias
config
que usaremos ao invés do normalgit
quando queremos interagir com nosso repositório de configuração. - Pomos uma bandeira – local para o repositório – para esconder arquivos que ainda não estamos rastreando explicitamente. Isto é para que quando você digitar
config status
e outros comandos mais tarde, arquivos que você não está interessado em rastrear não aparecerão comountracked
. - Também você pode adicionar a definição do apelido à mão no seu
.bashrc
ou usar a quarta linha fornecida por conveniência.
Eu empacotei as linhas acima em um snippet no Bitbucket e o liguei a partir de um short-url. Para que você possa configurar as coisas com:
curl -Lks http://bit.do/cfg-init | /bin/bash
Após ter executado a configuração, qualquer arquivo dentro da pasta $HOME
pode ser versionado com comandos normais, substituindo git
pelo seu recém criado config
alias, como:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push
Instale seus arquivos de pontos em um novo sistema (ou migre para esta configuração)
Se você já armazenou sua configuração/dofiles em um repositório Git, em um novo sistema você pode migrar para esta configuração com os seguintes passos:
- Prior para a instalação certifique-se de que você tenha comprometido o alias para seu
.bashrc
ou.zsh
:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
- E que seu repositório de código fonte ignore a pasta onde você irá cloná-lo, para que você não crie problemas estranhos de recursividade:
echo ".cfg" >> .gitignore
- Agora clone seus arquivos de pontos em um repositório nu em uma pasta “dot” do seu
$HOME
:
git clone --bare <git-repo-url> $HOME/.cfg
- Definir o pseudônimo no escopo da shell atual:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
- Verifica o conteúdo real do repositório vazio para o teu
$HOME
:
config checkout
- O passo acima pode falhar com uma mensagem como:
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
Aborting
Isto é porque a sua pasta $HOME
pode já ter alguns ficheiros de configuração de stock que seriam substituídos pelo Git. A solução é simples: faça backup dos arquivos se você se importa com eles, remova-os se você não se importa. Eu lhe forneço um possível atalho para mover todos os arquivos ofensivos automaticamente para uma pasta de backup:
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
- Realize o check out se você tiver problemas:
config checkout
- Definir a bandeira
showUntrackedFiles
ano
neste repositório (local) específico:
config config --local status.showUntrackedFiles no
- Você está pronto, de agora em diante você pode digitar
config
comandos para adicionar e atualizar seus arquivos de pontos:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push
Ganha como um atalho para não ter de se lembrar de todos estes passos em qualquer máquina nova que queira configurar, pode criar um script simples, guardá-lo como Bitbucket snippet como eu fiz, criar uma url curta para ele e chamá-lo assim:
curl -Lks http://bit.do/cfg-install | /bin/bash
Para completar isto é o que acabei por fazer (testado em muitos contentores Alpine Linux recém cunhados para o testar):
git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if ; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no
Wrapping up
Espero que ache esta técnica útil para seguir a sua configuração. Se você está curioso, meus arquivos de pontos vivem aqui. Também por favor mantenha-se ligado seguindo @durdn ou a minha fantástica equipa em @atlassiandev.