INICIO

Respaldar archivos de configuración con Git
Publicado: <2020-06-20 Sat>

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.

Autor: Edgar Uriel Domínguez Espinoza (edgar_uriel84 AT genomorro DOT name)

Última modificación: 2023-08-11 Fri 01:36

Emacs 29.1 (Org mode 9.6.6)