Como manter "arquivos de ponto" sob controle de versão?

30

O Etckeeper é uma ótima ferramenta para acompanhar as alterações nos seus arquivos de configuração /etc. Algumas coisas importantes realmente se destacam. Pode ser usado com uma ampla variedade de VCSs: git, mercurial, darcs ou bzr. Ele também faz confirmações automáticas diariamente e sempre que você instala, remove ou atualiza o pacote. Ele também controla as permissões de arquivo e os metadados de propriedade do usuário / grupo.

Eu também gostaria de manter meus "arquivos de ponto" no meu diretório pessoal também sob controle de versão, de preferência bazar. Alguém sabe se existe uma ferramenta como o etckeeper para esse fim?

Pior caso, imagino que um trabalho cron simples em execução bzr add && bzr ciuma ou duas vezes por dia, juntamente com a adição ~/Documents, ~/Music, etc à .bzrignore Alguém já fazer algo semelhante com um script?

Embora eu prefira bazar, outras opções podem ser interessantes.

andrewsomething
fonte
4
Discussão relacionada no Unix Stack Exchange: Dicas para colocar o ~ sob controle de origem . Não responde à sua pergunta, mas pode fornecer informações úteis.
Gilles 'SO- stop be evil'
11
Existem muitas ferramentas para isso agora. Veja dotfiles.github.io na seção "Utilitários dotfile de uso geral".
Robin Green
@RobinGreen Se você trabalhou com uma resposta adequada, eu poderia aceitá-la. bzrcertamente não é o caminho a seguir em 2015.
andrewsomething

Respostas:

7

Eu não sabia se havia algo que fizesse isso, então criei um código para obter exatamente o que você deseja usando meu repositório aqui: http://github.com/robertmassaioli/config-files

Eu tenho um arquivo que diz onde todos os arquivos pertencem e o programa generate_links apenas os coloca lá. Se você sabe o que está fazendo e pode compilar algum código Haskell, é realmente simples e fácil. Embora esteja avisado de que realmente foi feito para meu uso pessoal.

Robert Massaioli
fonte
3
+1 para haskell! -1 para haskel! ri muito. não, mas realmente.
Derek
Eu te escuto. Eu escolhi o Haskell porque estou aprendendo, pode ou não ser o melhor idioma adequado para o trabalho. :)
Robert Massaioli
3

Bem, fui em frente e fiz isso manualmente até encontrar uma solução melhor. Então, eu também poderia explicar o que fiz.

Primeiro eu fiz um bzr init ~, mas a próxima coisa que fiz foi bzr ignore "*". Decidi que não queria manter tudo sob controle de versão. Simplesmente não valeu a pena, especialmente quando você considera que existem algumas coisas que você realmente não deve manter em vcs como suas chaves. Então, eu tinha bzr addos arquivos específicos que queria. Você também pode adicionar exceções a .bzrignore. As expressões regulares do Python também são úteis. Eu estou mantendo-o bem magro por enquanto. Se tudo correr bem, devo acrescentar tudo ~/.confige ~/.gconftambém.

Também escrevi um script rápido que executei como um trabalho cron. Ele verifica se os arquivos foram alterados e, em caso afirmativo, uma confirmação automática:

#! /bin/bash

set -e

TIME=$(date)
STATUS=$(bzr status)

if [ -n "$STATUS" ]; then
    if [ -n "$1" ]; then
         bzr ci ~ -m "$1"
    else
        bzr ci ~ -m "Automatic commit on $TIME"
    fi
fi

exit
andrewsomething
fonte
Eu selecionei minha própria resposta quando publiquei isso pela primeira vez, mas decidi desfazer isso. Certamente não é a melhor resposta para esta questão em 2015.
andrewsomething
2

Transformei meu ~diretório inteiro em um repositório do Bazaar. O armazenamento de metadados não é um problema para arquivos no diretório inicial: tudo pertence à mesma conta e grupo e bzrjá armazena o bit de execução.

Eu adiciono manualmente os arquivos "interessantes" a ele (não quero que, por exemplo, minha coleção de músicas ou o cache do firefox esteja sob controle de versão), mas se você deseja automatizar isso com um script, acho que é a solução simples de fazer bzr add && bzr cinos diretórios selecionados ou na saída de um findcomando apenas fará o trabalho.

Riccardo Murri
fonte
2

Eu mantenho meus arquivos zsh e vim no git, colocados no github, em diferentes repositórios:

para zsh, por exemplo, criei ".zsh" e coloquei zshrc e zshenv nele, além de um script para vincular zshrc a ~ / .zshrc e zshenv a ~ / .zshenv, algo assim.

while true
do
read -p "do you want to link zshenv to ~/.zshenv (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshenv ~/.zshenv; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

while true
do
read -p "do you want to link zshrc to ~/.zshrc (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshrc ~/.zshrc; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

então eu faço

git clone git://git@github.com:tshirtman/.zsh
cd .zsh
./init.sh

para .vim, é quase o mesmo, exceto que eu uso submódulos para plugins, com patógeno, então eu adicionei isso no init.sh

git submodule init
git submodule update

e quando eu quero adicionar um plugin vim, eu faço

git submodule add git://github.com/nathanaelkane/vim-indent-guides.git bundle/vim-indent-guides

por exemplo.

ok, exigiria muito trabalho se você tiver mais do que alguns dirs de ponto que deseja gerenciar, mas nada impede que você os coloque todos no mesmo diretório ou separados por atividades (ativada para todos os editores gráficos, um para atividades na web ...) ou mais. enfim, foi o que eu fiz, então apenas meus dois centavos :).

tshirtman
fonte
1

Eu uso uma solução que não é automática como o etckeeper (eu tenho que confirmar manualmente), mas funcionou bem para mim. Não é tão desenvolvido quanto eu gosto, mas funciona.

Eu escrevi meu próprio utilitário que é semelhante ao GNU Stow , pois o stow não fez tudo o que eu queria. Eu chamo de Stow in Home . Quando executado, procura um diretório chamado "HOME". Ele pega tudo no diretório e o vincula ao local correspondente em $ HOME, criando os diretórios conforme necessário. Ele também converterá nomes de arquivos - se um arquivo começar com um '_', ele será substituído por um '.'. Fiz isso porque é melhor editar meus arquivos de ponto quando eles não estão ocultos (veja-os nas listagens de diretórios por padrão). Em seguida, os colocaria no nome que o aplicativo espera.

Então, eu tenho vários repositórios git para minha configuração. Eu só coloco arquivos de ponto que eu edito pessoalmente. A vantagem disso é que eu posso ter um repositório para arquivos de ponto que posso compartilhar com outras pessoas (como minha configuração do Emacs) e um para outras que são privadas (por exemplo, minha configuração do ssh, com nomes de host e outros itens de trabalho). A ligação simbólica com armazenamento em casa coloca tudo no lugar certo, mas o controle de origem para cada um pode ser separado.

Funcionou bem para mim. Realmente não há razão para eu não conseguir configurar algo para fazer confirmações automaticamente. Ou mova todos os arquivos de ponto para os repositórios apropriados e ainda use o armazenamento em casa. Mas foi assim que fiz as coisas.

Travis B. Hartwell
fonte
0

Você não pode adicionar o dot filesarquivo ao repositório usado no Etckeeper?

txwikinger
fonte
11
Como eu faria isso? ligar todos eles a algum lugar /etc?
andrewsomething
Bem .. que é uma opção
txwikinger
0

Eu fiz isso copiando todos os meus arquivos de pontos que eu gosto de manter sob controle de origem para uma pasta chamada "arquivos de pontos" no meu diretório / home /. Obviamente, isso significa manter duplicatas e copiar quando necessário, mas acho que essa é a solução mais fácil para mim.

Derek
fonte
11
em vez de ter que gerenciar duplicatas, você não poderia simplesmente criar links simbólicos para seus arquivos de ponto?
Ryan
Eu acho que você certamente pode!
Derek