Close

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 del git 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án sin 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:

bases de datos
Material relacionado

Cómo mover un repositorio de Git completo

Logotipo de Bitbucket
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 en no 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.

Gente que colabora utilizando un muro lleno de herramientas

Blog de Bitbucket

Ilustración de Devops

Ruta de aprendizaje de DevOps

Demostraciones de funciones con expertos de Atlassian del Centro de demostraciones

Cómo funciona Bitbucket Cloud con Atlassian Open DevOps

Suscríbete para recibir el boletín de DevOps

Thank you for signing up