Respaldar archivos de configuración con Git
Publicado:
La información siguiente es una traducción sintetizada de The best way to store your dotfiles: A bare Git repository.
Generalmente usamos git para poder tener un control de versión dentro de un directorio de trabajo. Cuando habilitamos un directorio de trabajo con git usamos el comando git init
.
Sin embargo, git puede crear repositorios más útiles para compartir con el comando git init --bare
, donde no existe un árbol de archivos de trabajo. Estos repositorios bare pueden funcionar para respaldar fácilmente los archivos de configuración creados en Linux.
Pasos a seguir
Crear el repositorio en el directorio $HOME
.
git init --bare $HOME/.cfg alias config='git --git-dir=$HOME/.cfg/ --work-tree=$HOME' config config --local status.showUntrackedFiles no
El directorio .cfg
tendrá la información del repositorio, tal como lo hace .git
en un repositorio de trabajo. En la segunda línea definimos el alias config
, con el cual manejaremos el repositorio. Con la tercera línea indicamos que el repositorio solo debe rastrear aquellos archivos que explícitamente le indiquemos.
Ahora creamos un alias para manejar el repositorio de forma más sencilla, para ello podemos usar el archivo .bashrc
o .bash_aliases
.
echo "alias config='git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bash_aliases
Como podemos ver, el alias indica que el directorio de trabajo es $HOME
y no .cfg
como en un directorio git común.
Uso
El uso es básicamente el mismo que en un repositorio git común, con la diferencia que usaremos la instrucción config
y no git
, por ejemplo:
$ config status En la rama master No hay commits todavía no hay nada para confirmar (crea/copia archivos y usa "git add" para hacerles seguimiento) $ config add .bash_aliases $ config status En la rama master No hay commits todavía Cambios a ser confirmados: (usa "git rm --cached <archivo>..." para sacar del área de stage) nuevo archivo: .bash_aliases Archivos no rastreados no son mostrados (usa la opción -u para mostrar los archivos sin seguimiento) $ config commit -m "Add bash_aliases" [master (commit-raíz) d7e4b1c] Add bash_aliases 1 file changed, 36 insertions(+) create mode 100644 .bash_aliases $ config remote add master git@gitlab.com:genomorro/cfg.git $ config push --set-upstream master master Enumerando objetos: 3, listo. Contando objetos: 100% (3/3), listo. Compresión delta usando hasta 8 hilos Comprimiendo objetos: 100% (2/2), listo. Escribiendo objetos: 100% (3/3), 800 bytes | 800.00 KiB/s, listo. Total 3 (delta 0), reusado 0 (delta 0), pack-reusado 0 remote: remote: remote: The private project genomorro/cfg was successfully created. remote: remote: To configure the remote, run: remote: git remote add origin git@gitlab.com:genomorro/cfg.git remote: remote: To view the project, visit: remote: https://gitlab.com/genomorro/cfg remote: remote: To gitlab.com:genomorro/cfg.git * [new branch] master -> master Rama 'master' configurada para hacer seguimiento a la rama remota 'master' de 'master'.
Restablecimiento
Para restablecer los archivos de configuración en otro equipo o situación similar, primero debemos asegurar que el directorio .cfg
no cause una recursión innecesaria:
echo ".cfg" >> .gitignore
Ahora hay que restaurar el repositorio:
git clone --bare <git-repo-url> $HOME/.cfg alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME' config checkout
Si en el checkout aparece un error tipo error: The following untracked working tree files would be overwritten by checkout simplemente elimina o respalda los archivos señalados, debido a que deben ser creados por git. Finalmente, asegurate de indicarle a git que no rastree archivos de forma automática:
config config --local status.showUntrackedFiles no
Submódulos
También podemos agregar submodulos, por si hemos copiado alguna configuración de otro repositorio:
config submodule add https://github.com/occivink/mpv-image-viewer.git .config/mpi
Si usas un submódulo, al restablecer el repositorio principal debes incluir la opción --recursive
al momento de clonar.