Administrar files de configuration de usuario en varias computadoras

Comúnmente trabajo en múltiples computadoras. Tengo varios files de configuration, por ejemplo, .bashrc , .gitconfig , .irbrc , .vimrc y carpetas de configuration, por ejemplo, .vim/ que contienen personalizaciones valiosas. A veces quiero pequeñas variaciones en la configuration entre las diferentes computadoras.

Quiero usar el control de versiones para administrar estos diferentes files.

  • ¿otros usan control de versiones para administrar sus files de configuration?
  • ¿Cuáles son algunos consejos que pueden hacer esto más fácil?
  • ¿Cuál es la forma más elegante de lidiar con las variaciones entre las computadoras?
  • Estoy cómodo con git ; ¿cualquier otra sugerencia?

Guardo una carpeta en ~/config/ que es un repository bzr. Empujo / tiro el repository entre mis varias computadoras para sincronizarlo. Tengo un script de installation que utilizo para hacer enlaces simbólicos a mi directory de inicio:

 #! /bin/sh # link all files to the home directory, asking about overwrites cd `dirname $0` SCRIPT_DIR=`pwd` SCRIPT_NAME=`basename $0` FILES=`bzr ls --versioned --non-recursive` cd $HOME for FILE in $FILES; do ln --symbolic --interactive $SCRIPT_DIR/$FILE done rm $TARGET_DIR/$SCRIPT_NAME 

Si desea usar git en lugar de bzr, puede usar:

 FILES=`git ls-tree --name-only HEAD` 

(Tuve que pedir SO para averiguarlo)

EDITAR: En realidad, ya no hago esto, ahora tengo un repository dotfiles en github, con un buen script de installation de rake que alguien más escribió.

Por el momento, utilizo un repo de git clonado. Para mantener las cosas simples, el único file que necesita variar entre las diferentes máquinas es .bashrc . Es bueno si solo puede haber una versión de este file que responda de manera diferente en diferentes máquinas. Por lo tanto, en mi .bashrc :

 if [ $(hostname) == 'host1' ]; then # things to do differently on host1. elif [ $(hostname) == 'host2' ]; then # things to do differently on host2. fi 

Obviamente, esto tiene algunas limitaciones (como que se requeriría una técnica diferente para .vimrc u otros files de configuration que necesiten personalización), pero funciona bastante bien.

¡Con CfEngine puede administrar files de configuration en varias máquinas y también muchas cosas más! La curva de aprendizaje es tal vez un poco alta, pero vale la pena si tiene que administrar / actualizar / mantener un grupo de computadoras que ejecutan Linux regularmente.

Si usa git, podría definir un repo de "origen" para ser el maestro; y luego haz un clon en cada computadora que trabajas. podría usar una twig para que cada computadora tenga su set de files de configuration.

Uso holgura para una situación similar. holgura permite la definición de roles / subroles para que pueda administrar files con pequeñas variaciones, ya sea a través de un file clonado o parche. El directory slack es luego administrado por git en mi implementación.

Aquí hay algunos administradores de files dotfile:

  • nostálgico : Basado en Ruby
  • homeshick : Igual que el primero, pero sin dependencia de ruby
  • dfm : escrito en Perl

git con sucursales para computadoras personalizadas, con synchronization automática al iniciar session parece una buena solución para mí.

He usado etckeeper para las configuraciones de versiones, pero nunca me he expandido a las configuraciones de usuario.

Este tipo de preguntas surgen ocasionalmente, y nunca he visto una herramienta para manejar este caso de uso común, así que escribí un script que usa git y enlaces simbólicos para administrar estos files.

Ver http://github.com/bstpierre/dotfiles

No es perfecto Actualmente hay un error relacionado con el event handling directorys, y todavía no hay soporte para variaciones en las computadoras.

Antes de usar cualquier herramienta de esta naturaleza, ¡asegúrese de tener buenas copys de security!

Creo que lo que quieres podría ser similar a lo que he estado haciendo …

Haga un directory en casa llamado .host_configs/ . Esta es una versión controlada. O en mi caso, que vive en una carpeta especial en una computadora central, lo guardo en cualquier máquina nueva. Dentro, haga una carpeta para cada host para el que desee configuraciones diferentes. La carpeta para cada host debe nombrarse después del nombre de host corto para esa máquina. Entonces en tu git repo tienes:

 .host_configs/ homecomp1/ girlfriendcomp1/ workcomp1/ workcomp2/ 

En cada carpeta específica del host, coloque los files de configuration .vimrc, .irbrc, etc. para ese cuadro específico. Y también, en cada carpeta de host haga un file llamado .[SHORT_HOST]_rc . Por ejemplo, si su máquina tiene un nombre "sano", tenga un file llamado .sane_rc … Este file contendrá las líneas que normalmente estarían en .bashrc que son exclusivas de ese host. Por ejemplo, si es un mac y necesita alias ls='ls -GF' lugar de alias ls='ls --color=auto' que funciona para la mayoría de las máquinas nix para ls con colors, ponga esa línea en .[SHORT_HOST]_rc para esa máquina, junto con las funciones especiales, declaraciones, etc., que normalmente entrarían en .bashrc o .profile, etc. (o .zshrc, .tschrc, según sea el caso). Entonces, la carpeta controlada por la versión ~/.host_configs/ ve así:

 .host_configs/ homecomp1/ .homecomp1_rc #special shell configs for this hostname .vimrc #you know the rest .irbrc .Xresources girlfriendcomp1/ .girlfriendcomp1_rc .vimrc .bubblebathrc workcomp1/ .workcomp1_rc .bashrc .vimrc workcomp2/ .workcomp2_rc .bashrc .vimrc 

Uso todos los mismos barebones $ HOME / .bashrc (o ~ / .tshrc, etc.) en todas mis máquinas. Simplemente tomo el básico que viene con la distribución en cuestión y muevo toda la configuration específica del host al .host-configs/[SHORT_HOST]/.[SHORT_HOST]_rc .

Pon esto en la parte inferior (de $HOME/.bashrc ):

 export SHORT_HOST="sane" for file in `find ~/.host_configs/$SHORT_HOST -name ".*"` do ln -s $file `basename $file` done source ~/`.$SHORT_HOST`_rc 

(Encuentra todos los files de puntos para el host y ~/.host_configs/foo_host un enlace simbólico en el hogar de la carpeta ~/.host_configs/foo_host ). Sus files dot están en su location normal, pero están enlazados simbólicamente al control de versión. Lo anterior también [$SHORT_HOST]_rc todas las líneas en su file [$SHORT_HOST]_rc en .bashrc

Puede volver a comprometerse con git desde la carpeta ~/.host_configs/ siempre que tenga cambios.

Eso es lo que parece en shell, que es probablemente todo lo que necesita, pero si necesita otras características, escribiría algo que use los mismos principios (obteniendo un file .rc externo en .bashrc y enlazando todos los files de configuration a los estructurados). carpeta de control de versiones) en algo más versátil / less feo que el shell. Entonces, en lugar de lo anterior en tu .bashrc, podría haber:

 export SHORT_HOST="sane" ruby ~/import_conf.rb $SHORT_HOST 

… y escriba su file import_conf.rb para hacer una gestión de conf más compleja, como colocar un file de configuration específico en algún directory además de su casa, o manejar una carpeta de configuration como .ssh /, .subversion / etc. Eso es lo que hago, es bastante elegante para mí, pero puede haber mejores soluciones. Dropbox con algunos enlaces simbólicos creativos también es una excelente idea, aunque confía en un tercero y necesita estar en un entorno gráfico. También tenga en count que hay inconsistencias entre lo que puede hacer con symlinks + dropbox en Linux y los accesos directos + Dropbox en Windows si implementa algo que quiere jugar con Windows.

Ahora también hay vcsh

Del LÉAME:

vcsh: gestiona files de configuration en $ HOME a través de repositorys falsos de git

[…]

vcsh le permite tener varios repositorys de git, todos manteniendo sus treees de trabajo en $ HOME sin golpearse entre sí. Eso, a su vez, significa que puede tener un repository por set de configuration (zsh, vim, ssh, etc.), seleccionando y eligiendo qué configuraciones desea usar en cada máquina.

Funciona a la perfección, pero puede ser un poco desalentador si no eres un usuario experimentado de git.