Sincronizar tus dotfiles y configuraciones con Git en cualquier sistema

  • Centralizar los dotfiles en uno o varios repositorios Git permite clonar rápidamente tu entorno en nuevas máquinas, incluidas configuraciones de shell, editores y herramientas de desarrollo.
  • Existen dos enfoques principales: repositorios con symlinks y el método de repositorio bare sobre el HOME, que evita mover archivos y simplifica el versionado.
  • La sincronización puede ampliarse a programas y servicios mediante listas de paquetes, scripts de instalación y soporte para gestores como apt, brew, winget, pip, npm o snap.
  • La seguridad es crítica: conviene usar repos privados, gestionar secretos de forma cifrada y adaptar las configuraciones a cada sistema (Linux, macOS, Windows o Codespaces).

Sincroniza tus dotfiles y configuraciones de Windows mediante repositorios Git

Si trabajas a diario con varias máquinas o sueles reinstalar tu sistema, seguramente te habrás encontrado mil veces con la misma historia: instalar programas, ajustar la terminal, configurar el editor, los atajos de teclado (por ejemplo, mediante accesos rápidos con AutoHotkey), las claves, el prompt… y repetirlo una y otra vez. Es un auténtico tostón y, además, es fácil que entre tanta reinstalación pierdas pequeños detalles de configuración que hacían tu entorno especialmente cómodo.

El enfoque moderno para evitar ese dolor de cabeza es centralizar tus dotfiles y configuraciones en uno o varios repositorios Git. De esta forma puedes clonar tu entorno en cualquier máquina (Linux, macOS e incluso Windows, con matices) y aplicar buenas prácticas para mantenerlo seguro, como explican guías sobre mantener Windows 11 seguro, versionar cada cambio y automatizar buena parte de la instalación de programas y servicios. En este artículo vamos a ver, con bastante profundidad, cómo funciona todo esto, qué métodos existen, qué herramientas puedes usar y cómo combinarlo con la instalación de software y la gestión de secretos.

Qué son realmente los dotfiles y qué papel juega Windows aquí

Tradicionalmente llamamos dotfiles a los archivos y carpetas ocultos que empiezan por un punto en sistemas tipo Unix: Linux, macOS y BSD. Ejemplos clásicos son .bashrc, .zshrc, .vimrc, .gitconfig, .nanorc o directorios como ~/.config/nvim. Guardan la configuración de shells, editores, herramientas de consola, clientes de correo, gestores de paquetes y un largo etcétera.

En Windows el concepto no es exactamente el mismo, pero la idea sí lo es: tienes archivos de configuración repartidos entre %USERPROFILE%, AppData, ficheros de VS Code, configuraciones de Git, scripts de PowerShell, ajustes de WSL… Aunque no empiecen por punto, puedes tratarlos como “dotfiles” a efectos prácticos y versionarlos igual que harías en Linux.

El truco consiste en pensar en tu entorno como un conjunto de configuraciones portables: parte vive en archivos (que sí se pueden meter en un repo Git), parte en programas instalados y parte en secretos (claves, tokens, contraseñas) que no deberías subir sin cifrar. Con eso en mente, Git se convierte en la pieza central para sincronizar todo lo que no sea estrictamente dependiente del hardware o de tu sistema operativo concreto.

Por qué merece la pena sincronizar tus dotfiles

Sincronizar dotfiles tiene sentido en cuanto pasas de un único equipo “principal”. Si tocas dos portátiles, varios servidores o mezclas un Mac, un Linux y un Windows, tener el mismo entorno familiar en todos ellos ahorra muchísimo tiempo y reduce la fricción de cambiar de máquina.

Las ventajas más habituales que comentan los usuarios que han dado el paso son: mismas combinaciones de teclas, mismos alias, mismo tema de shell, mismas funciones de Git, mismas configuraciones de Vim/Neovim, SSH y herramientas de terminal. En la práctica, significa que dejas de “sentirte torpe” cada vez que abres una sesión nueva en otra máquina.

Además, la sincronización se vuelve clave cuando tienes que preparar varios equipos seguidos, algo muy habitual en entornos de desarrollo, universidades o empresas. Si en tu portátil principal ya tienes todo afinado, quieres que el nuevo PC (o codespace en la nube) adopte ese estado base lo más rápido posible, sin andar recordando a mano qué instalar y qué toquetear.

Eso sí, conviene marcar límites: no todo es razonable sincronizarlo. Hay configuraciones pegadas a cierto hardware (tarjetas gráficas, rutas de discos específicos, dispositivos externos) o a versiones concretas de drivers y servicios. También hay configuraciones sensibles que es mejor separar y tratar como secretos cifrados.

Configuración de dotfiles multiplataforma

Qué conviene sincronizar (y qué no tanto)

La realidad es que, a día de hoy, no existe una solución mágica para clonar al 100 % un sistema completo solo con dotfiles. Lo que sí podemos es cubrir un porcentaje muy alto de nuestro “entorno de trabajo” y dejar fuera lo estrictamente ligado al hardware o a servicios locales muy específicos.

Ejemplos muy habituales de archivos que la gente sincroniza son:

  • .gitconfig y ficheros .gitignore globales.
  • .zshrc, .bashrc, .p10k.zsh, .zimrc y otros ajustes de shell.
  • .vimrc o configuración de Neovim (~/.config/nvim/init.vim o init.lua).
  • Configuración de clientes de correo en terminal, como .muttrc.
  • Archivos de configuración de herramientas de línea de comandos, AWS CLI, Docker, etc.

En cambio, hay elementos que pueden dar problemas si intentas clonarlos sin pensar: configuraciones con rutas absolutas a discos que solo existen en una máquina, parámetros de drivers gráficos, cosas muy asociadas a un portátil concreto, dispositivos USB, etc. Copiarlas sin filtrar puede romper aplicaciones o, como mínimo, generar errores molestos.

Y luego están los datos sensibles: claves SSH privadas, tokens de API, contraseñas de servicios, claves GPG… Estos nunca deberían ir en texto plano a un repositorio público. Incluso en repos privados, es recomendable usar herramientas tipo git-crypt, SOPS o cifrado con GPG, o guarda esos secretos en un gestor externo (Bitwarden, 1Password, etc.). Para más cuidados de privacidad relacionados con configuraciones en Windows consulta asegura tu privacidad en Windows 11.

  El FBI investiga malware oculto en juegos de Steam

Enfoque clásico: carpeta de dotfiles y enlaces simbólicos

Uno de los métodos más sencillos y antiguos para gestionar dotfiles consiste en reunir todos los archivos de configuración en un directorio dedicado (por ejemplo, ~/.dotfiles) y luego crear enlaces simbólicos desde tu $HOME hacia esa carpeta.

El flujo de trabajo básico sería más o menos así:

  1. Localizas los archivos o carpetas de configuración que quieres versionar dentro de tu directorio personal (incluidos los que empiezan por punto; puedes usar ls -a para verlos).
  2. Mueves esos archivos o directorios a la carpeta .dotfiles para que queden centralizados.
  3. Creas enlaces simbólicos desde tu $HOME a la ruta nueva, de forma que las aplicaciones sigan encontrando los ficheros donde esperan, pero el contenido real esté dentro de .dotfiles.

Ejemplo rápido en Linux o macOS:

mv ~/.bashrc ~/.dotfiles/
ln -s ~/.dotfiles/.bashrc ~/.bashrc

Si te equivocas con algún enlace simbólico o cambias de opinión sobre dónde alojar un archivo, puedes deshacerlo con unlink:

unlink ~/.bashrc

Una vez que tienes la estructura en ~/.dotfiles, conviertes esa carpeta en un repositorio Git (o clonas una ya existente). A partir de ahí, todo es usar comandos normales de Git: añadir archivos, hacer commits, subir a Github, GitLab, etc. Puedes incluso organizar el interior con subcarpetas para shell, editores, lenguajes, scripts, etc.

Repositorio de dotfiles con enlaces simbólicos

Automatizar symlinks, estructura y exclusiones

Hacer enlaces simbólicos a mano para cada archivo funciona, pero es muy pesado si tienes muchas configuraciones. Lo más práctico es escribir uno o varios scripts que automaticen ese proceso y que puedas ejecutar cada vez que estrenes máquina nueva.

Un patrón típico es mantener en tu repo de dotfiles un script de instalación que recorra una lista de archivos y carpetas, compruebe si ya existen, haga copias de seguridad si hace falta y luego cree los symlinks. Así, solo tienes que lanzar algo tipo ./install.sh y dejar que haga el trabajo sucio.

La organización interna también es importante. No hay un estándar rígido, pero muchos usuarios utilizan esquemas inspirados en repos de referencia (como los de CodelyTV u otros dotfiles populares de GitHub): agrupar por programa (shell/, vim/, git/, apps/) o por tipo (config, bin, langs…). Lo esencial es que tú mismo entiendas dónde está cada cosa.

Para evitar que Git rastree archivos que no te interesan (cachés compiladas, temporales, ficheros privados), necesitas un .gitignore bien afinado. Por ejemplo, puedes decirle que ignore todos los archivos .zwc de Zsh o directorios que contengan datos privados:

shell/zsh//.zwc
shell/zsh//.zwc.old
//private-*

El mayor inconveniente de este enfoque basado en symlinks es que tienes que recordar qué está enlazado y dónde. Si un día decides deshacer la sincronización, toca eliminar enlaces y devolver los ficheros a su ubicación original. Además, hay aplicaciones que no se llevan bien con enlaces simbólicos y exigen un archivo “real” en la ruta esperada.

Método avanzado: repositorio Git bare sobre tu HOME

Para muchas personas, gestionar symlinks es un engorro y prefieren un enfoque más limpio. Ahí entra el uso de un repositorio Git en modo bare apuntando directamente a tu directorio personal. Es un método muy popular porque evita mover archivos y no requiere enlaces simbólicos.

Un repositorio bare es un repo Git sin directorio de trabajo: contiene solo los metadatos y objetos de Git (lo que normalmente hay dentro de .git), pero no una copia “normal” de los archivos. Eso nos permite colocar ese repositorio bare en, por ejemplo, ~/.dotfiles y decirle a Git que el árbol de trabajo es tu $HOME.

Los pasos básicos para montar este sistema serían:

  1. git init --bare para crear el repositorio en $HOME/.dotfiles.
  2. Definir un alias que apunte al repo y al árbol de trabajo para facilitar comandos.
  3. Configurar que no muestre archivos no rastreados para evitar ruido en $HOME.
  4. Añadir los ficheros que quieras versionar y hacer commit.
  5. Conectar un remoto y push para copia de seguridad.

A partir de ahí, trabajar con tus dotfiles es tan simple como usar el alias: dotfiles status, dotfiles add, dotfiles commit, dotfiles pull, etc., desde cualquier ruta. No hay symlinks, los archivos se quedan en su ubicación habitual y es Git quien los versiona de forma “invisible”.

Clonar tus dotfiles en otras máquinas (Linux, macOS y Windows)

Cuando estrenas un nuevo equipo y quieres replicar tu entorno, el método del repo bare resulta especialmente elegante: clonas el repo, recreas el alias y haces checkout para desplegar todo.

En un segundo equipo, los pasos serían algo así:

  1. Clonar el repositorio como bare en la misma ubicación oculta:
    git clone --bare :tuusuario/dotfiles.git $HOME/.dotfiles
    
  2. Volver a definir el alias en la nueva máquina:
    alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
    
  3. Hacer checkout de los archivos versionados:
    dotfiles checkout
    

Es muy probable que ya existan archivos como .bashrc o .gitconfig creados por el sistema o por ti mismo antes de sincronizar. Para no perder nada, puedes moverlos a una carpeta de backup antes de forzar el checkout; si algo se rompe, también tienes opciones para restablecer la configuración por defecto en Windows. Hay trucos con grep, awk y xargs para automatizarlo, pero la idea básica es:

mkdir -p .dotfiles-backup
# Mover los archivos conflictivos a la copia de seguridad y repetir el checkout

Este mismo esquema funciona sobre WSL en Windows (que al final es un entorno Linux) de forma casi idéntica. Si quieres versionar también configuraciones puramente “Windows” (PowerShell, VS Code en Windows, etc.), puedes incluirlas igualmente en el repo, aunque tengas que adaptar rutas y condicionales para que no molesten en Linux o macOS.

  Aislamiento de procesos en Windows Sandbox y configuración de políticas

Sincronizar configuraciones en Windows con Git

Diferencias entre distribuciones y sistemas: Arch, Fedora, Debian, macOS y Windows

Una duda muy frecuente es si los dotfiles se pueden compartir sin más entre distribuciones distintas (por ejemplo, Arch y Fedora) o incluso entre sistemas radicalmente diferentes como Linux y Windows. La respuesta corta es: sí, pero con cabeza.

La mayor parte de la configuración de herramientas de usuario es portable: tu .zshrc, tu configuración de Vim/Neovim, tus alias de Git, tus funciones de shell… todo eso suele funcionar igual en Arch, Fedora, Debian o Ubuntu, siempre que tengas instalados los mismos programas.

Donde aparecen diferencias es en las rutas, gestores de paquetes y algunas utilidades. Por ejemplo, la forma de instalar software con apt, dnf o pacman cambia, y a veces la ubicación de ciertos archivos de configuración también. En Windows, además, buena parte de las rutas son distintas (C:\Users\usuario, AppData\Roaming, etc.) y deberás usar condicionales o archivos separados.

Hay varias estrategias para gestionar estos casos:

  • Usar ramas diferentes del repo para cada sistema (por ejemplo, main para Linux, otra rama para Windows).
  • Meter lógica condicional dentro de los propios dotfiles, comprobando variables como $OSTYPE, $HOSTNAME o similares.
  • Organizar el repo por sistemas (linux/, windows/, macos/) y usar scripts específicos de instalación.

Por ejemplo, en un .bashrc podrías tener algo como:

if ; then
  export EDITOR=nano
fi

En resumen, que usar Arch y Fedora (o mezclar Windows con WSL) no invalida tus dotfiles, pero sí te obliga a pensar un poco en qué partes son comunes y cuáles deben ser específicas de cada entorno.

Sincronizar también programas: listas de paquetes y scripts de instalación

Guardar solo los archivos de configuración está bien, pero te deja a medias si luego tienes que instalar manualmente todos los programas en cada máquina. Una buena práctica es complementar tu repo de dotfiles con scripts o listas de paquetes para replicar también el software instalado.

Existen varias estrategias, según el sistema:

  • En macOS, usar Homebrew y su comando brew bundle.
  • En Debian y derivadas, exportar la lista de paquetes con dpkg-query y luego instalar con apt.
  • En Windows, aprovechar winget para exportar e importar el catálogo de aplicaciones.
  • Para pip (Python) y NPM (Node.js), guardar la lista de paquetes globales.
  • Si usas snap, apoyarte en sus snapshots para exportar/recuperar datos.

Ejemplos prácticos de exportación:

# macOS - Homebrew
brew bundle dump --file="$HOMEBREW_BUNDLE_FILE_PATH" --force

# Debian/Ubuntu - lista de paquetes instalados
sudo dpkg-query -l | awk '{if ($1 == "ii") print $2}' > packages_list.txt

# Windows - con winget
winget export exported_winget.txt

# Paquetes pip globales
pip freeze > "$DOTFILES_PATH/langs/python/requirements.txt"

# Módulos globales de npm
ls -1 /usr/local/lib/node_modules | grep -v npm > "$DOTFILES_PATH/langs/js/global_modules.txt"

Para la importación, el flujo inverso:

# macOS
brew bundle --file="$HOMEBREW_BUNDLE_FILE_PATH" --force

# Debian/Ubuntu
sudo xargs -a packages_list.txt apt install

# Windows
winget import exported_winget.txt

# pip
pip install -r "$DOTFILES_PATH/langs/python/requirements.txt"

# npm
xargs -I_ npm install -g "_" < "$DOTFILES_PATH/langs/js/global_modules.txt"

Si usas paquetes snap, puedes guardar snapshots y moverlos dentro de tu proyecto de dotfiles:

# Limpiar snapshots antiguos
# (para quedarte solo con la última copia de cada app)

snap save                 # genera un ZIP por programa
mv /var/lib/snapd/snapshots ~/.dotfiles/apps/snap
# Hacer symlink de vuelta a /var/lib/snapd/snapshots

snap install app1 app2    # reinstalar apps
snap restore <id>         # restaurar configuración por ID del snapshot

Como alternativa (o complemento) puedes crear un script de instalación a medida que combine gestores de paquetes y snaps, pida contraseña de sudo una sola vez y deje todo instalado en bloque:

#!/bin/bash
# Obtener privilegios de root una sola vez
echo <password> | sudo -S echo
echo "Ahora puedes usar sudo sin volver a meter la contraseña"

# Instalar via apt
sudo apt install app1 app2 app3 -y

# Intentar arreglar instalaciones fallidas
sudo apt install -f -y

# Instalar via snap
sudo snap install app1 app2 app3

Este tipo de script lo guardas dentro del propio repo de dotfiles y, tras darle permisos de ejecución, lo lanzas en cada máquina nueva. Y si algo se te resiste con la opción de exportar/importar listas, lo añades explícitamente a tu script.

Dotfiles en GitHub Codespaces y sincronización de ajustes de VS Code

Si utilizas GitHub Codespaces, la película es muy parecida, pero en entorno remoto. Ahí tienes dos mecanismos principales de personalización: la sincronización de ajustes de VS Code y el uso de un repositorio de dotfiles dedicado.

  Formas sencillas de encontrar la IP de dispositivos en tu red local

La sincronización de configuración de VS Code permite que temas, atajos, snippets, extensiones y ciertos estados de la interfaz se compartan entre la aplicación de escritorio y el cliente web. Esa configuración se guarda en la nube y se empuja/extrae cada vez que activas la opción de “settings sync”. Puedes elegir si quieres que los codespaces web usen esa configuración o mantenerlos independientes.

Por otro lado, GitHub Codespaces puede clonar automáticamente un repo de dotfiles que tengas configurado en tus ajustes de usuario. Al crear un codespace nuevo, GitHub clona ese repo en el entorno y busca scripts con nombres estándar como:

  • install.sh, install
  • bootstrap.sh, bootstrap
  • script/bootstrap
  • setup.sh, setup
  • script/setup

Si encuentra alguno de ellos, lo ejecuta para configurar el entorno: instalación de herramientas, alias, ajustes de shell, etc. Si no hay script, lo que hace es enlazar de forma simbólica los archivos que empiezan por . en ese repo hacia el ~ del codespace, replicando el comportamiento de los symlinks que comentábamos antes.

La relación entre repositorios “de confianza”, GPG y sincronización de ajustes también juega un papel: sólo se sincroniza en ambas direcciones (sube y baja de la nube) en repos que hayas marcado como confiables. En repos no confiables, la sincronización se limita a traer la configuración una sola vez, sin volver a subir cambios desde ese codespace.

Herramientas externas para gestionar dotfiles: Stow, chezmoi, dotdrop y compañía

Además de los enfoques “a pelo” con Git (normal o bare), existen herramientas especializadas para orquestar dotfiles: GNU Stow, yadm, dotbot, chezmoi, dotdrop… Cada una ataca el problema de una forma ligeramente distinta: algunas generan symlinks de forma muy controlada, otras trabajan con plantillas, y otras añaden gestión de secretos o integración con gestores de contraseñas.

ChezMoi, por ejemplo, es una opción muy potente y flexible. Trabaja con una estructura propia donde los archivos se renombran (por ejemplo, de .zshrc a dot_zshrc) y se apoyan en plantillas y prompts para personalizar la instalación según el sistema o el host. Para algunos usuarios esto es ideal; otros lo encuentran molesto porque herramientas como Neovim dejan de reconocer la extensión original del archivo y pierdes cosas como el resaltado de sintaxis, salvo que instales plugins adicionales.

Alguien que gestionaba dotfiles en cinco o más máquinas con distintos sistemas (Gentoo, Ubuntu, Debian, macOS) comentaba que pasó de un repo Git sencillo a dotdrop y finalmente a chezmoi, donde pudo montar un framework muy elaborado: detección de binarios instalados, instalación unificada a través de apt, brew, cargo y scripts, integración con Bitwarden para obtener claves GPG y rellenar automáticamente authorized_keys vía URL en servidores, etc.

Si no quieres tanta complejidad, el método de repo bare suele ser más que suficiente. Pero si buscas algo hiperpersonalizable, con plantillas según sistema operativo, host y tipo de máquina, merece la pena echar un ojo a herramientas como chezmoi o dotdrop, sabiendo que tienen su curva de aprendizaje.

Seguridad: repos privados, secretos y acceso por SSH

Mientras montas toda esta infraestructura, la seguridad no puede ir “de relleno”. Tus dotfiles pueden contener información muy delicada: rutas internas, nombres de host, usuarios de bases de datos, y en el peor de los casos, claves privadas o tokens de API.

Algunas buenas prácticas básicas que deberías aplicar desde el minuto uno:

  1. Usar repositorios privados si vas a subir configuraciones que puedan revelar algo sensible. No es infalible, pero ya es un buen filtro.
  2. No subir nunca claves privadas ni contraseñas en texto plano. Si necesitas versionar ese tipo de datos, recurre a cifrado con git-crypt, SOPS o GPG, o guarda esos secretos en un gestor externo (Bitwarden, 1Password, etc.).
  3. Revisar periódicamente quién tiene acceso a tus repos de dotfiles, cambiar contraseñas y renovar claves cuando toque.
  4. Conectarte a repos remotos y servidores usando claves SSH en lugar de contraseñas, y activar la autenticación en dos pasos en los proveedores que lo permitan.

Una búsqueda rápida de cosas como openai_api_key en GitHub es una buena cura de humildad: se encuentran montones de secretos expuestos sin querer. No quieres verte en esa lista; mejor pecar de prudente y dejar fuera de tu repo todo lo que tenga pinta de credencial.

Al final, construir y sincronizar un repositorio de dotfiles sólido —ya sea con symlinks tradicionales, con un repositorio bare sobre tu HOME, apoyándote en herramientas como chezmoi o integrándolo en GitHub Codespaces— te permite convertir en algo rutinario lo que antes era un infierno de reinstalaciones, scripts sueltos y configuraciones perdidas; la clave está en ir incorporando solo lo que entiendes, separar bien configuraciones de secretos y apoyarte en Git para tener siempre tu entorno “de casa” listo para clonar en la próxima máquina, sea Linux, macOS o Windows.

Configuración de Core Isolation y Memory Integrity en Windows
Artículo relacionado:
Configuración de Core Isolation y Memory Integrity en Windows