Archivos ocultos: la mejor forma de almacenarlos en un repositorio bare de Git
Descargo de responsabilidad: El título es ligeramente hiperbólico, hay otras soluciones probadas al problema. Sin embargo, la técnica propuesta me parece muy elegante.
Hace poco leí sobre esta técnica en un hilo de Hacker News con soluciones que daba la gente para almacenar sus archivos ocultos. El usuario StreakyCobra presentó su configuración y... ¡todo encajó! Estoy en el proceso de cambiar mi propio sistema a esta técnica. El único requisito es instalar Git.
En sus palabras, la técnica requiere:
Nada de herramientas adicionales ni enlaces simbólicos, los archivos se rastrean en un sistema de control de versiones, puedes usar diferentes ramas para diferentes ordenadores y puedes replicar la configuración fácilmente en las nuevas instalaciones.
La técnica consiste en almacenar un repositorio bare de Git en una carpeta "secundaria" (como $HOME/.cfg o $HOME/.myConfig) con un alias especialmente diseñado para que los comandos se ejecuten en ese repositorio y no en la carpeta local habitual .git, lo que interferiría con cualquier otro repositorio de Git existente.
Empezar desde cero
Si nunca has rastreado tus configuraciones en un repositorio de Git, puedes empezar a usar esta técnica fácilmente con este código:
git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrcLa primera línea crea una carpeta
~/.cfgque es un repositorio bare de Git que rastreará nuestros archivos.Luego creamos un alias
configque usaremos en lugar delgitnormal cuando queramos interactuar con nuestro repositorio de configuración.Establecemos una marca -local en el repositorio, para ocultar los archivos que aún no estamos rastreando explícitamente. De esta forma, cuando escribas
config statusy otros comandos más adelante, los archivos que no quieres rastrear no se mostraránsin seguimiento.También puedes añadir la definición de alias a mano a tu
.bashrco usar la cuarta línea proporcionada para mayor comodidad.
Yo he empaquetado las líneas anteriores en un fragmento de código en Bitbucket y lo he vinculado desde una URL corta. Así puedes hacer la configuración:
curl -Lks http://bit.do/cfg-init | /bin/bashDespués de ejecutar la configuración, se puede hacer un control de versiones de los archivos de la carpeta $HOME con comandos normales, reemplazando git por el alias config que acabamos de crear:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config pushInstalar tus archivos ocultos en un sistema nuevo (o migra a esta configuración)
Si ya almacenas tus archivos ocultos/configuración en un repositorio de Git, en un sistema nuevo puedes migrar a esta configuración con los siguientes pasos:
Antes de la instalación, comprueba que has confirmado el alias en tu
.bashrco.zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'Comprueba también que tu repositorio de origen ignora la carpeta en la que lo clonarás, para que no crees problemas de recursividad:
echo ".cfg" >> .gitignoreAhora clona tus archivos ocultos en un repositorio bare en una carpeta "dot" de tu
$HOME:
git clone --bare <git-repo-url> $HOME/.cfgDefine el alias en el alcance del shell actual:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'Extrae el contenido real del repositorio base en tu
$HOME:
config checkoutEl paso anterior puede fallar con un mensaje como este:
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
AbortingEsto se debe a que es posible que tu carpeta $HOME ya tenga algunos archivos de configuración de stock que Git sobrescribiría. La solución es sencilla: haz una copia de seguridad de los archivos si te importan y elimínalos si te dan igual. Te doy un atajo para mover todos los archivos incorrectos automáticamente a una carpeta de respaldo:
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}Vuelve a ejecutar la extracción si has tenido problemas:
config checkoutEstablece la marca
showUntrackedFilesennoen este repositorio (local):
config config --local status.showUntrackedFiles noTodo listo, a partir de ahora puedes escribir comandos
configpara añadir y actualizar tus archivos ocultos:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config pushDe nuevo, para no tener que recordar todos estos pasos en cualquier máquina nueva que quieras configurar, puedes crear un script simple, almacenarlo como fragmento de código de Bitbucket como lo hice yo, crear una URL corta para él y llamarlo así:
curl -Lks http://bit.do/cfg-install | /bin/bashPor exhaustividad, terminé con esto (probado en muchos contenedores de Alpine Linux hechos precisamente para eso):
git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if [ $? = 0 ]; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles noEn resumen…
Espero que esta técnica te sea útil para rastrear tu configuración. Si tienes curiosidad, mis archivos ocultos están aquí. Además, puedes seguirme con el usuario @durdn o seguir a todo el equipo en @atlassiandev para estar al tanto de todo.