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/.bashrc
- La primera línea crea una carpeta
~/.cfg
que es un repositorio bare de Git que rastreará nuestros archivos. - Luego creamos un alias
config
que usaremos en lugar delgit
normal 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 status
y 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
.bashrc
o 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:
Material relacionado
Cómo mover un repositorio de Git completo
VER LA SOLUCIÓN
Aprende a usar Git con Bitbucket Cloud
curl -Lks http://bit.do/cfg-init | /bin/bash
Despué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 push
Instala 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
.bashrc
o.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" >> .gitignore
- Ahora clona tus archivos ocultos en un repositorio bare en una carpeta "dot" de tu
$HOME
:
git clone --bare <git-repo-url> $HOME/.cfg
- Define 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 checkout
- El 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.
Aborting
Esto 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 checkout
- Establece la marca
showUntrackedFiles
enno
en este repositorio (local):
config config --local status.showUntrackedFiles no
- Todo listo, a partir de ahora puedes escribir comandos
config
para 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 push
De 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/bash
Por 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 no
En 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.
Compartir este artículo
Tema siguiente
Lecturas recomendadas
Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.