Come mantenere i "file dot" sotto il controllo della versione?


30

Etckeeper è un ottimo strumento per tenere traccia delle modifiche ai file di configurazione /etc. Alcune cose chiave su questo spiccano davvero. Può essere utilizzato con un'ampia varietà di VCS: git, mercurial, darc o bzr. Effettua inoltre il commit automatico ogni giorno e ogni volta che installi, rimuovi o aggiorni il pacchetto. Tiene inoltre traccia delle autorizzazioni dei file e dei metadati di proprietà di utenti / gruppi.

Vorrei anche mantenere i miei "file dot" nella mia directory home anche sotto il controllo della versione, preferibilmente bazar. Qualcuno sa se esiste uno strumento come etckeeper per questo scopo?

Caso peggiore, immagino che un semplice processo di cron in esecuzione bzr add && bzr ciuna o due volte al giorno con l'aggiunta ~/Documents, ~/Music, ecc per la .bzrignore Chiunque già facendo qualcosa di simile con uno script?

Mentre preferirei il bazar, altre opzioni potrebbero essere interessanti.


4
Discussione correlata a Unix Stack Exchange: suggerimenti per mettere ~ sotto il controllo del codice sorgente . Non risponde alla tua domanda, ma può comunque fornire informazioni utili.
Gilles 'SO- smetti di essere malvagio' il

1
Ci sono molti strumenti per questo ora. Vedi dotfiles.github.io nella sezione "Utilità dotfile per scopi generici".
Robin Green

@RobinGreen Se la trasformassi in una risposta adeguata, potrei accettarla. bzrnon è certo la strada da percorrere nel 2015.
andrewsomething

Risposte:


7

Non sapevo se ci fosse qualcosa che lo ha fatto, quindi ho preparato un po 'di codice per ottenere esattamente quello che vuoi usando il mio repository qui: http://github.com/robertmassaioli/config-files

Ho un file che dice dove appartengono tutti i file e il programma generate_links li mette tutti lì. Se sai cosa stai facendo e puoi compilare un po 'di codice Haskell, allora è davvero semplice e facile. Tuttavia, tieni presente che è stato realizzato per il mio uso personale.


3
+1 per haskell! -1 per haskel! lol. no ma davvero.
Derek,

Ti sento. Ho scelto Haskell perché lo sto imparando, potrebbe o meno essere la migliore lingua adatta al lavoro. :)
Robert Massaioli,

3

Bene, sono andato avanti e l'ho fatto manualmente fino a trovare una soluzione migliore. Quindi potrei anche spiegare cosa ho fatto.

Prima ho fatto un bzr init ~, ma la prossima cosa che ho fatto è stata bzr ignore "*". Decisi che non volevo tenere tutto sotto controllo della versione. Non ne valeva la pena, specialmente se si considera che ci sono alcune cose che non dovresti davvero tenere in vcs come le tue chiavi. Quindi ho dovuto bzr addi file specifici che volevo. Puoi anche aggiungere eccezioni a .bzrignore. Anche le espressioni regolari di Python sono utili. Lo sto mantenendo piuttosto sottile per ora. Se tutto va bene, potrei aggiungere tutto ~/.confige ~/.gconfanche.

Ho anche scritto uno script veloce che eseguo come cron job. Verifica se i file sono stati modificati e, in tal caso, esegue un commit automatico:

#! /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

Avevo selezionato la mia risposta quando l'ho pubblicato per la prima volta, ma ho deciso di annullarla. Non è certamente la migliore risposta a questa domanda nel 2015.
Andrewsomething

2

Ho trasformato tutta la mia ~directory in un repository Bazaar. La memorizzazione dei metadati non è un problema per i file nella home directory: tutto è di proprietà dello stesso account e gruppo e bzrgià memorizza il bit di esecuzione.

Aggiungo manualmente i file "interessanti" (non voglio, ad esempio, che la mia raccolta musicale o la cache di Firefox sia sotto il controllo della versione), ma se vuoi automatizzare questo con uno script, penso che sia la semplice soluzione di fare bzr add && bzr cisu directory selezionate o sull'output di un findcomando farà semplicemente il lavoro.


2

Tengo i miei file zsh e vim in git, messi su github, in diversi repository:

per zsh, per esempio, ho creato ".zsh" e vi ho inserito zshrc e zshenv, oltre a uno script per collegare zshrc a ~ / .zshrc e zshenv a ~ / .zshenv, qualcosa del genere.

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

faccio così

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

per .vim, è quasi lo stesso, tranne che uso sottomoduli per plugin, con patogeno, quindi l'ho aggiunto in init.sh

git submodule init
git submodule update

e quando voglio aggiungere un plugin vim, lo faccio

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

per esempio.

ok, richiederebbe un po 'troppo lavoro se hai più di qualche punto dir che vuoi gestire, ma nulla ti impedisce di metterli tutti nella stessa directory, o separati dalle attività (attivo per tutti gli editor grafici, uno per attività web ...) o giù di lì. comunque, è quello che ho fatto, quindi solo i miei due centesimi :).


1

Uso una soluzione che non è automatica come etckeeper (devo impegnarmi manualmente), ma ha funzionato bene per me. Non è sviluppato come mi piace, ma funziona.

Ho scritto la mia utility simile a GNU Stow , poiché stow non ha fatto tutto ciò che desideravo. Lo chiamo Stow in Home . Quando eseguito, cerca una directory denominata "HOME". Prende quindi tutto sotto quella directory e lo collega alla posizione corrispondente in $ HOME, creando le directory necessarie. Tradurrà anche i nomi dei file - se un file inizia con un '_', verrà sostituito con un '.'. L'ho fatto perché è più bello per modificare i miei file dot quando non sono nascosti (vederli negli elenchi di directory per impostazione predefinita). Quindi li inserirà nel nome previsto dalla propria applicazione.

Quindi, ho diversi repository git per la mia configurazione. Metto solo i file di punti che modifico personalmente in essi. Il vantaggio di questo è che posso avere un repository per file dot che posso condividere con altri (come la mia configurazione di Emacs) e uno per altri che sono privati ​​(diciamo, la mia configurazione ssh, con nomi host e simili per lavoro). Il symlinking mette con stow-in-home mette tutto al posto giusto, ma il controllo del codice sorgente per ognuno può essere separato.

Ha funzionato bene per me. Non c'è davvero alcun motivo per cui non sia possibile impostare qualcosa per eseguire automaticamente i commit. Oppure sposta tutti i file di punti nei repository appropriati e usa ancora stow in home. Ma è così che ho fatto le cose.



0

L'ho fatto copiando tutti i miei dotfile che mi piace tenere sotto controllo del codice sorgente in una cartella chiamata "dotfile" nella mia directory / home /. Naturalmente questo significa mantenere duplicati e copiare avanti e indietro quando necessario, ma trovo che questa sia la soluzione più semplice per me.


1
invece di dover gestire i duplicati, non potresti semplicemente creare collegamenti simbolici ai tuoi dotfile?
Ryan,

Penso che puoi sicuramente!
Derek,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.