it-swarm-es.tech

Consejos para poner ~ bajo control de fuente

Quiero poner mi directorio de inicio (~) bajo control de fuente (git, en este caso), ya que tengo muchos archivos de configuración (.gitconfig, .gitignore, .emacs, etc.) allí me gustaría transportar a través de máquinas, y tenerlos en Git sería bueno para recuperarlos.

Mi máquina principal es mi MacBook, y por la forma en que está configurado OS X, hay muchas carpetas que quiero ignorar (Documentos, Descargas, .ssh). También hay carpetas que ya están usando Git (.emacs.d).

Pensé en agregar todos estos directorios a mi archivo .gitignore, pero eso parece un poco cansado y podría tener algunas consecuencias imprevistas. Lo siguiente que pensé fue copiar periódicamente los archivos que quiero almacenar en alguna carpeta en casa, y luego confirmar esa carpeta. El problema con eso será que tengo que recordar moverlos antes de comprometerme.

¿Hay una manera limpia de hacer esto?

78
Dan McClain

Yo tengo $HOME bajo git. La primera línea de mi archivo .gitignore es

/*

El resto son patrones para no ignorar usando el ! modificador. Esta primera línea significa que el valor predeterminado es ignorar todos los archivos en mi directorio de inicio. Los archivos que quiero controlar de versión entran en .gitignore Me gusta esto:

!/.gitignore
!/.profile
[...]

Un patrón más complicado que tengo es:

!/.ssh
/.ssh/*
!/.ssh/config

Es decir, solo quiero la versión .ssh/config - No quiero que mis claves y otros archivos en .ssh entren en git. Lo anterior es cómo lo logro.

Editar: Se agregaron barras diagonales para iniciar todas las rutas. Esto hace que los patrones de ignorar coincidan desde la parte superior del repositorio ($ HOME) en lugar de cualquier lugar. Por ejemplo, si !lib/ era un patrón (no ignores todo en el directorio lib) y agregaste un archivo .gitignore, anteriormente el patrón (!.gitignore) coincidía con eso. Con la barra inclinada (!/.gitignore), solo coincidirá con .gitignore en mi directorio personal y no en ningún subdirectorio.

No he visto un caso en el que esto haga una diferencia práctica con mi lista de ignorados, pero me parece más técnico desde el punto de vista técnico.

60
camh

Lo que hago (con los mismos objetivos) es colocar mis archivos de configuración en un subdirectorio ~/lib y tengo enlaces simbólicos en mi directorio de inicio, por ejemplo, .emacs -> lib/emacs/dot.emacs. Solo guardo los archivos de configuración que escribí explícitamente bajo control de versiones; mi directorio de inicio contiene gran cantidad de archivos de puntos creados automáticamente que no están bajo control de versiones. Así ~/lib está bajo control de versión y mi directorio de inicio no.

Tengo un script que crea los enlaces simbólicos de los archivos en ~/lib. Cuando creo una cuenta en una nueva máquina, la relleno revisando ~/lib y ejecutando ese script.

Mi experiencia es con CVS, no con git, por lo que no es 100% transferible. Una de las razones por las que no puse mi directorio de inicio directamente bajo CVS es que ~/.cvsignore se aplicaría a todos mis pagos de CVS y no solo a mi directorio de inicio; git no tiene este problema. La desventaja de ese enfoque en comparación con tener el directorio de inicio bajo control de versiones es que no puede usar git status para distinguir entre un archivo que explícitamente ha decidido ignorar (que figuraría en el archivo de ignorar, por lo que no se muestra) y un archivo sobre el que no tiene ninguna opinión (que se mostrará con un ?).

Algunos archivos deben ser diferentes en diferentes máquinas. Los puse en un directorio llamado ~/Local/SITENAME/lib y cree enlaces simbólicos para ellos o (para los formatos de archivo que lo admiten) tienen una directiva de inclusión en el archivo bajo ~/lib. También tengo un enlace simbólico ~/Here -> ~/Local/SITENAME. Dado que git, a diferencia de CVS, está diseñado para admitir repositorios en su mayoría similares pero no idénticos, puede haber una mejor manera de administrar archivos específicos de la máquina. De hecho, algunos de mis archivos de puntos no son enlaces simbólicos, sino que se generan automáticamente a partir del contenido bajo ~/lib y ~/Here.

Podemos usar la capacidad de Git para continuar rastreando archivos incluso si están listados en .gitignore. Entonces, esto es suficiente para .gitignore:

$ cat .gitignore
/*

Para cada archivo que desee rastrear, ejecute add -f (el -f el parámetro anula ignorando ambos en .gitignore y .git/info/exclude):

git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config

Una vez que haya indexado un archivo, Git rastreará todos los cambios a pesar del hecho de que el archivo se ignora. Lo mismo funciona para un directorio, pero solo para los archivos que están realmente presentes:

git add -f somedirname

Si desea realizar un seguimiento de un directorio completo con todos los archivos nuevos que aparecen en él, puede excluirse de .gitignore de alguna manera, descrito en respuesta por camh :

!/somedirname

Si alguna vez quiere dejar de rastrear un archivo, este comando elimina un archivo del índice de Git pero lo deja intacto en el disco duro:

git rm --cached .ssh/config
11
Nick Volynkin

Reviso mis archivos de configuración para $HOME/.conf/ de un repositorio de BitBucket Mercurial. Un repositorio de GitHub funcionaría igual de bien.

Los ~/.conf checkout contiene archivos de configuración y un script de Shell para completar enlaces simbólicos en $HOME a cada archivo en ~/.conf. Para formatos de configuración que admiten la inclusión (.bashrc, .inputrc, .vimrc, etc.) Incluyo el ~/.conf archivo en lugar de vincularlo, para que pueda hacer anulaciones locales.

Para algunos archivos de configuración, hago un enlace simbólico a un archivo en mi carpeta de Dropbox y comparto a través de Dropbox.

Durante algunos meses intenté mantener $HOME en sí mismo en el control de versiones, pero estoy cansado de administrar las listas masivas de ignorados, estoy cansado de verificar los cambios de configuración realizados al ejecutar aplicaciones, y el resultado ni siquiera era algo que quisiera ver en otra computadora. ¿Te imaginas arreglar conflictos sobre ~/.gconf o ~/.config/monitors.xml, ¿o para diferentes versiones de aplicaciones de escritorio?

Me resulta más fácil hacer un enlace simbólico o incluir una lista limitada de archivos de configuración que he personalizado personalmente y que quiero compartir entre máquinas como valores predeterminados globales.

5
Graham

Yo uso el viejo rcs para eso.

Consulte las páginas de manual de ci, co y rcs. Esos sitios también deberían ser útiles:

Lo uso para la versión que controla mis archivos de puntos, por ejemplo:

ci -u .*vimrc

Y si quiero editarlos:

co -l .*vimrc

Recomiendo hacer un directorio llamado RCS en su ~, puede hacer una copia de seguridad de ese directorio en algún lugar fácilmente.

5
polemon

Acabo de empezar a usar el siguiente Python Script Dotfiles, que es una herramienta útil que enlaza automáticamente los archivos por usted: https://pypi.python.org/pypi/dotfiles

3
trojjer

Creo que su segundo presentimiento de tener una carpeta no relacionada bajo control de fuente es buena.

Simplemente agregue 2 scripts de Shell allí. Uno para copiar archivos bajo su control a ~ y el otro para recopilar archivos de ~ y cópielo de nuevo en la carpeta controlada por la fuente y confirme.

1

Aquí hay un pequeño script Ruby) que utilizo para configurar una nueva máquina

#!/usr/bin/env Ruby
# setup.rb

#list of dirs which you don't want to symlink
ignored = %w(.gitignore .gitmodules misc setup.rb readme)

current_dir = File.expand_path(Dir.pwd)
home_dir = File.expand_path("~")

links = `git ls-tree --name-only HEAD`.lines.map(&:strip).select {|x| !ignored.include?(x)  }

links.each do |link|
  link = File.join(current_dir, link)
  symlink = File.join(home_dir, File.basename(link))
  `ln -ns #{link} #{symlink}`
end
0
Khaja Minhajuddin