Once I've refined the idea in Spanish, I'll write it in English or maybe not I don't know
Resumen #
La solución un repositorio Git que vive en $HOME de forma invisible solo con un alias en mi terminal, puramente Git.
Idea #
Después de intentar varios métodos y herramientas para mantener organizado mis archivos de configuración en $HOME, ninguno me terminaba de convencer hasta que encontré el método de github.com/andersix/dotfiles
Un repositorio Git que no tiene un work-tree propio, solo se referencia a un alias, ejemplo:
1alias gh='git --git-dir=$HOME/Projects/home/ --work-tree=$HOME'
Donde gh (git home) es un alias git con directorio a mi $HOME/Projects/home pero el work-tree es mi $HOME
Con esto usando el alias gh puedo administrar mis archivos de configuración.
Seguridad (Importante no lo saltes) #
Este es el punto mas importante, jamás debes hacer commit de env files, claves privadas, contraseñas, tokens, historiales. De mi parte te obligo a que generes un .gitignore en tu $HOME donde agregues todas estas excepciones.
En la metodología original excluyen los archivos que no quieren rastrear, como lo hacemos normalmente para un proyecto. y usan la opción gh config status.showUntrackedFiles no para eliminar el ruido visual de todos los archivos que se podrían ir con un inocente gh add .
Pero como este no es un proyecto cualquiera ya que $HOME contiene información personal y por lo tanto privada, opté por un gitignore inverso.
Excluye todo, solo incluye lo necesario. Todo esto sin ocultar los archivos no rastreados
ejemplo:
# Ignora todo en $HOME
/*
# Exclusion de archivos basicos del proyecto
!.gitignore
!LICENSE.md
!README.md
# Configuraciones en $HOME; no respetan XDG dirs
!.bashrc
!.profile
# Configuraciones en $XDG_CONFIG_HOME directory
!.config
.config/*
!.config/bash/**
!.config/helix/**
!.config/starship.toml
# Repite el proceso con tus archivos de configuracion necesarios
el truco mental está en habilitar un directorio pero deshabilitar su contenido, para poder alcanzar los archivos y directorios internos. Te recomiendo que juegues con esto para entender el concepto; resumiendo:
# SIEMPRE deshabilitas todo
/*
# Al hacer un gh status
# Esto te muestra todo dentro de ~/.config
!.config
!.config/bash/**
# Al hacer un gh satus
# Esto solo reincluye ~/.config/bash/ y todos sus subdirectorios
!.config
.config/*
!.config/bash/**
# El inconveniente que veo es cuando son existe mucha anidacion
# supongamos que quiero todo solo dentro de .config/bash/functions/
# =================================
# .config
# |- archivo.txt
# |- dir/
# |- archivo.tmp
# |- bash/
# |- file01.bash
# |- file02.bash
# |- functions # <-- este directorio de aqui
# |- fun01.bash
# |- fun02.bash
# |- zdir/
# |- archivo.z
=================================
# tienes que hacer algo como
!.config
.config/*
!.config/bash
.config/bash/*
!.config/bash/functions/**
# asi al hacer un gh status
# solo te mostrara los cambios dentro de .config/bash/functions/
Uso #
Como a nadie le importa la configuración de otros, voy desde el principio
Configuración inicial #
Obviamente tener instalado git además de su configuración básica (agregar nombre y correo de usuario) es el primer paso. Una vez esto creas el directorio donde vivirá bare repository
1mkdir ~/Projects/home
Creas un alias, agregalo a tu ~/.bashrc o ~/.zshrc o similar
1alias gh='git --git-dir=$HOME/Projects/home/ --work-tree=$HOME'
IMPORTANTE Aplica los puntos vistos en el apartado de Seguridad
Crear un .gitignore en tu $HOME excluye todo, agrega solo los archivos necesarios.
Por último agregar un repositorio remoto para poder hacer push
1gh remote add origin REPOSITORIO
donde REPOSITORIO claramente es una URL valida de lectura y escritura.
Listo, ahora podemos comenzar a rastrear archivos y hacer push a el repositorio, funciona exactamente igual que cualquier repositorio git. Pero en lugar de usar git add ~/.bashrc usas tu alias gh add ~/.bashrc
La configuración entre mis computadoras personales es igual, así que yo tengo todo bajo master pero es posible usar branches para configuraciones de diferentes maquinas.
Replicar a otras computadoras #
Supongamos que es una instalación nueva, instalas Git, configuras y clonas el repositorio
1git clone --bare REPOSITORIO $HOME/Projects/home/
Habilitas el alias
1alias gh='git --git-dir=$HOME/Projects/home/ --work-tree=$HOME'
y despliegas los archivos en $HOME Advertencia: esto sobrescribe los archivos existentes tal vez existan algunos archivos que no se pueden sobrescribir puedes forzar gh checkout --force también funcionaría mover o renombrar los archivos
1gh checkout
Flujo de trabajo #
Con estas configuraciones habilitadas en las maquinas solo queda usar un flujo de trabajo git de toda la vida, para subir un cambio de maquina A
1gh add ~/.config/environtment.d/env.conf
2gh commit -m "Modifica env.conf"
3gh push -u origin main
para descargar un cambio en maquina B
1gh pull # si eres rudo
2# o en su defecto
3gh fetch origin
4gh merge origin/main
En el caso de que sea una configuración nueva, es decir crear un archivo nuevo de configuración y trackear recuerda que tienes que agregar la exclusión en tu $HOME/.gitignore esto puede ser tedioso pero para mi flujo de trabajo, es algo que no me toma mas de 10 segundos; prefiero eso a tener todo mi $HOME en un repositorio publico.
por cierto; tengo una función en mi bashrc que elimina los archivos markdown del proyecto, así después de clonar limpio mi $HOME
1gh update-index --assume-unchanged "$HOME"/{README.md,LICENSE.md}
2rm "$HOME"/{README.md,LICENSE.md}
Experiencia #
Esta metodología me a resultado bastante cómoda de aplicar, cero dependencias claro a excepción de Git. Pero me es muy minimalista, además de que para mi es una herramienta de uso diario así que no tengo una curva de aprendizaje.
Si buscas una forma de administrar tus archivos de configuración recomiendo que le des una oportunidad.