Manera eficiente de administrar un repository git para files de configuration local

~/.emacs mis files de configuration ( ~/.bashrc , ~/.emacs , ~/emacs , etc.) en git. La forma en que configuré esto fue simplemente para agregar un repository de git en el directory de inicio.

Encontré que este enfoque tiene algunos problemas:

  • git gui lleva una eternidad, porque escanea de forma recursiva todo el directory de inicio.
  • A veces agrego accidentalmente files al repository de configuration que deberían ir a un repository nuevo (creo un nuevo proyecto, digamos en ~/projects/foo , olvide que aún no tiene un repository git inicializado, y ejecute git add bar.xyz en el directory foo . Esto da como resultado que se agregue un file al repository de configuration).

No estoy seguro de que sea sensato tener repositorys git nesteds en un directory que ya tiene un repository git, aunque todavía no he encontrado ningún problema fundamental con esto.

¿Hay un mejor enfoque, o es esta una forma estándar en que las personas almacenan files de configuration local en git?

Estoy usando un repository de git para administrar los files de puntos. Contiene:

  1. un directory dotfiles , que contiene los dotfiles / dotdirs reales que quiero rastrear.
  2. un script de shell, para crear un enlace simbólico de dotfiles/.* en $HOME , como

     for dotfile in dotfiles/.* ; do case $(basename $dotfile) in .) ;; ..) ;; *) ln -sv $(realpath dotfile) $HOME/$(basename $dotfile) ;; esac done 

La secuencia de commands se ejecuta manualmente después de agregar algo nuevo en dotfiles de dotfiles (normalmente moviendo un dotfiles de dotfiles en repository), o en un $HOME nuevo y limpio.

El repository puede residir en cualquier lugar. Tengo un clon en $HOME en cada host que estoy usando.

De esta manera, tengo un tree de trabajo mucho más pequeño y no nested, para rastrear los files de puntos de forma selectiva.

ps Es posible que desee agregar inputs como dotfiles/.config/* a .gitignore , contiene muchos files de los que no quiero rastrear.

Guardo mis files de puntos en un repository de Git como tú: mi directory de inicio es un repository de Git.

  • git gui : rara vez lo uso, así que no estoy seguro de cómo su performance se ve afectado por una gran cantidad de files sin seguimiento. Sin embargo, tengo un file ~/.gitignore que simplemente contiene * . Tal vez ignorar todo acelerará git gui para ti.

  • ~/.gitignore accidentalmente files: la creación de un file ~/.gitignore que simplemente contenga * también resuelve el problema de agregar accidentalmente un file a su repository de files dotfiles cuando olvida inicializar un nuevo repository de proyecto (le dirá que use -f si realmente quiero agregar el file).

  • Nunca he tenido un problema con los repositorys nesteds.

Algunas notas:

  • La razón principal por la que configuro mi ~/.gitignore es * para que el git status no muestre todos los files en mi directory personal. Me obliga a usar git add -f todo el time, lo cual es un poco molesto, pero no tanto.

  • Adquiera el hábito de usar git clean -dx lugar de git clean -dxf . Deberá recordar ejecutar git config clean.requireForce false en los repositorys de proyectos nuevos, pero le impedirá eliminar accidentalmente todos sus files en su directory de inicio si no está en el directory en el que cree que se encuentra. .

  • Git a veces decide restablecer los permissions de files. Esto puede ser malo si desea mantener files confidenciales ( chmod og-rwx ) en su repository de Git. Lo manejo a través de un ~/.ssh/authorized_keys post-checkout que corrige los permissions de ciertos files y directorys (por ejemplo, ~/.ssh/authorized_keys ).