¿Crear un repositorio de Git en / (root) para la configuración de seguimiento?

28

Así que uso Git principalmente para fines de desarrollo, pero me di cuenta de que podía usarlo para almacenar versiones de los archivos de configuración que tengo en mi instalación de Ubuntu.

Mi configuración propuesta es:

  • git init un repositorio en /

  • Agregue un .gitignoreat /que ignore cualquier archivo, excepto la configuración específica que deseo rastrear.

    Por ejemplo, .gitignorepodría contener ( fuente ):

    ## Ignore everything...
    *
    
    ## Except...
    !/etc/default/tlp
    !/etc/crontab
    
  • Cada vez que cambio estas configuraciones de bajo nivel, puedo rastrearlas.

¿Hay algo que pueda salir mal con esta configuración? ¿El núcleo siempre necesita /tener solo ciertas carpetas? ¿Va a estropear el funcionamiento de cualquier aplicación?

Abhishek Divekar
fuente
Tal vez usted debe considerar sus ~archivos de configuración del directorio casa en lugar de /archivos
Michael Durrant
1
El antiguo servidor público grex SunOS tenía todos sus archivos rc y quién sabe qué más en algún control de fuente antiguo (no estoy seguro si era SCCS o RCS, pero definitivamente más antiguo que CVS). No veo un problema con esto.
Joshua
@ Mike Durrant: cosas como /etc/crontaben mi laptop personal son definitivamente mías, pero entiendo lo que quieres decir.
Abhishek Divekar
77
Usar etckeepery hacer copias de seguridad.
Restablece a Monica - M. Schröder
Solo tenga cuidado de no poner en escena / cometer accidentalmente ie / dev / sda o similar: D
quetzalcoatl

Respuestas:

37

La respuesta a ambas preguntas es no, puede crear cualquier directorio que desee en el /. Supongo que lo único que podría suceder son algunos problemas de permisos con algunas rutas espaciales.

Sin embargo, es mejor almacenar el .gitdirectorio en otro lugar, algo así parece:

git --git-dir=/home/user/backup-root --work-tree=/

Lea aquí .

Ravexina
fuente
55
Muy interesante, ¡en realidad no sabía que podías hacer esto en git! Gracias por la sugerencia.
Abhishek Divekar
Esa es la misma característica que le permite rastrear solo archivos de configuración en / home / user por cierto. Agregar un alias de shell adicionalmente hace que esto sea muy conveniente.
Daniel Jour
19

En realidad, es probable que desee archivos de configuración de control de versiones en /etc/(que no se preocupan por las entradas del directorio raíz /, en particular directorios como proco usr, o binen /) así que es posible que desee instalar el etckeeperpaquete

Y también puede controlar la versión de algunos subdirectorios seleccionados (como el /usr/share/applications/que mencionó).

Sin embargo, no te metas con el sistema de administración de paquetes de Ubuntu . Quizás debería hacer una copia de seguridad de la lista actual de paquetes instalados.

Basile Starynkevitch
fuente
1
De hecho, me importan los archivos, /usr/share/applicationsya que ocasionalmente me meto con ellos.
Abhishek Divekar
6

Tener un repositorio de git en / funciona bien, excepto que hace que sea difícil darse cuenta cuando tienes un repositorio de git de menor nivel con problemas, ya que responderá a todos ellos.

Nota: Es menos trabajo y probablemente más útil usar 'debsums'

sudo apt-get install debsums

Lo que le permitirá detectar rápidamente (la mayoría) de los cambios en los archivos binarios o en los archivos de configuración.

Como ejemplo de los paquetes instalados, aquí están los que difieren de los paquetes ascendentes.

$ sudo debsums -c
/boot/vmlinuz-4.10.0-19-generic

Y puede obtener una lista de archivos de configuración modificados con:

$ sudo debsums -ec
debsums: missing file /etc/default/chromium-browser (from chromium-browser package)
 /etc/libvirt/libvirt.conf
 <snip>

Observe cómo el navegador de cromo está incorrectamente empaquetado y tiene un archivo en la lista de archivos del paquete que no existe.

/var/lib/dpkg/info/chromium-browser.list

Esto utiliza los datos dpkg y evita un gran directorio /.git y flujo de trabajo.

gdahlm
fuente
¿Podría explicar "excepto que hace que sea difícil darse cuenta cuando tiene un repositorio git de nivel inferior con problemas, ya que responderá a todos ellos". ¿un poco más? No entiendo cómo podría causar un problema si .gitignore solo rastrea algunos archivos.
Abhishek Divekar
2
Creo que @abhidivekar OP dice que cuando creas otro git repo en say /home/$USERentonces .gitin in /responderá por cualquier comando git dado para el repositorio en /home$USERlugar de para ese [ .girarchivo] en /home/$USER...
George Udosen
Ah, ya veo. Creo que debería guardarlo en una carpeta separada entonces. O /
Abhishek Divekar
1
@George Para acceder al .gitdirectorio más alto en el árbol, solo tienes que acceder cda él o a un subdirectorio que no tiene una .gitcarpeta (un directorio normal)
cat
2
@abhidivekar Correcto, no es un problema si los beneficios superan a los problemas, pero es un comportamiento inesperado. No es un bloqueador, solo una advertencia.
gdahlm
5

Así que he estado explorando las otras respuestas y he encontrado un procedimiento que me funciona:

  • Haz un .gitignoreat /. Esto fue mucho más complicado de lo que pensé que sería, debido a la forma en que Git maneja los archivos de la lista blanca en subcarpetas. Usé este y este enlace para ayudarme.

    ## Source: /programming//a/29932318/4900327
    ## Comments are on new lines because trailing whitespace matters in Git (stackoverflow.com/a/8865858/4900327)
    
    # Blacklist all files, folders and subfolders in the same directory as the .gitignore file.
    /*
    # Do not blacklist the .gitignore file.
    !.gitignore
    
    # Now whitelist certain files.
    # For files in subfolders, some hoops must be jumped through (stackoverflow.com/a/16318111/4900327):
    
    ## Whitelisting files in /etc/ folder:
    # Whitelist the /etc/ folder (the git repo folder is whitelisted always)
    !/etc/
    # Blacklist all files in /etc/ folder.
    /etc/*
    # Whitelist specific file(s) in /etc/ folder.
    !/etc/crontab
    
    
    ## Whitelisting files in /etc/default/ folder:
    # /etc/ is already whitelisted, and its contents blacklisted.
    # Whitelist /etc/default/ folder.
    !/etc/default/
    # Blacklist all files in /etc/default/ folder.
    /etc/default/*
    # Whitelist specific file(s) in /etc/default/ folder.
    !/etc/default/tlp
    
    
    ## Whitelisting files in /home/USERNAME/ folder:
    # Whitelist /home/ folder.
    !/home/
    # Blacklist all files in /home/ folder.
    /home/*
    # Whitelist /home/USERNAME/ folder.
    !/home/USERNAME/
    # Blacklist all files in /home/USERNAME/ folder.
    /home/USERNAME/*
    # Whitelist specific file(s) in /home/USERNAME/ folder
    !/home/USERNAME/.bash_profile
    !/home/USERNAME/.bashrc
    
  • Vaya /y ejecute git init .Hasta ahora, no he podido almacenar la .git/carpeta en otro directorio utilizando el enlace mencionado por @Ravexina .

  • Corre git add .y git status. Debería obtener una lista de todos los archivos de configuración que Git está rastreando.

    If you used the above `.gitignore`, it should track `/etc/crontab`, `/etc/default/tlp`, `/home/USERNAME/.bash_profile`, and `/home/USERNAME/.bashrc`.
    
  • Comprometerse con git commit -m "Initial settings files".

  • Puede realizar un seguimiento de los cambios con git log -p -- path/to/fileo gitk path/to/file. Más discusión sobre esto aquí .

Abhishek Divekar
fuente
2

Si va a almacenar cosas sensibles (como /etc/shadow) en el repositorio de git, debe asegurarse de que no todos los usuarios puedan leerlo, ya que de forma predeterminada los objetos tendrán permiso 444y los directorios tendrán permiso 0755. Puede cambiar el permiso de .gitto 700o ponerlo en/root

Otro problema es que git no almacena permisos de archivos como el sistema de archivos, y no almacena atributos extendidos. Para los archivos, git solo almacena si son ejecutables. Entonces, si desea restaurar un archivo eliminado, su propietario y grupo serán root (si lo hace como root), y su permiso será 644o 755. Puede ser problemático para los archivos de configuración de servicios cuyo propietario no es root.

yt7b97q-
fuente