Criando um repositório Git em / (root) para rastrear configurações?

28

Então, eu uso o Git principalmente para fins de desenvolvimento, mas acabei de perceber que poderia usá-lo para armazenar versões dos arquivos de configurações que tenho na instalação do Ubuntu.

Minha configuração proposta é:

  • git init um repo em /

  • Adicionar .gitignorea /ignora todos os arquivos, exceto as configurações específicas que desejo rastrear.

    Por exemplo, o .gitignorepoderia conter ( fonte ):

    ## Ignore everything...
    *
    
    ## Except...
    !/etc/default/tlp
    !/etc/crontab
    
  • Sempre que altero essas configurações de baixo nível, posso rastreá-las.

Existe algo que poderia dar errado com essa configuração? O kernel sempre precisa /ter apenas determinadas pastas? Isso atrapalhará o funcionamento de qualquer aplicativo?

Abhishek Divekar
fonte
Talvez você deve considerar seus ~arquivos de configurações de diretório casa ao invés de /arquivos
Michael Durrant
1
O antigo servidor público grex SunOS tinha todos os seus arquivos rc e quem sabe mais o que há em algum controle de origem antigo (não tenho certeza se era SCCS ou RCS, mas definitivamente mais antigo que o CVS). Não vejo problema com isso.
Joshua
@ Mike Durrant: coisas como /etc/crontabno meu laptop pessoal são definitivamente minhas, mas entendo o que você quer dizer.
Abhishek Divekar
7
Use etckeepere faça backups.
Reponha Monica - M. Schröder
Só tome cuidado para não acidentalmente para o estágio / commit ie / dev / sda ou similar: D
quetzalcoatl

Respostas:

37

A resposta para ambas as perguntas é não, você pode criar qualquer diretório que desejar no /. a única coisa que poderia acontecer são alguns problemas de permissão com alguns caminhos espaciais, eu acho.

No entanto, é melhor armazenar o .gitdiretório em outro lugar, algo parecido com:

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

Leia aqui .

Ravexina
fonte
5
Muito interessante, eu realmente não sabia que você poderia fazer isso no git! Obrigado pela sugestão.
Abhishek Divekar
Esse é o mesmo recurso que permite rastrear apenas os arquivos de configuração em / home / user btw. A adição de um apelido de shell também torna isso muito conveniente.
Daniel Jour
19

Na verdade, você provavelmente vai querer arquivos de configuração de controle de versão em /etc/(você não se preocupam com as entradas de diretório raiz /, nomeadamente diretórios como procou usrou binem /) para que você pode querer instalar o etckeeperpacote

E você também pode controlar a versão de alguns subdiretórios selecionados (como o /usr/share/applications/que você mencionou).

No entanto, não mexa no sistema de gerenciamento de pacotes Ubuntu . Talvez você deva principalmente fazer backup da lista atual de pacotes instalados.

Basile Starynkevitch
fonte
1
Na verdade, eu me importo com os arquivos, /usr/share/applicationspois ocasionalmente mexo com eles.
Abhishek Divekar
6

Ter um repositório git em / funciona bem, exceto que dificulta a observação quando você tem um repositório git de nível inferior com problemas, pois ele responde por todos eles.

Nota: É menos trabalhoso e provavelmente mais útil usar 'debsums'

sudo apt-get install debsums

O que permitirá detectar rapidamente (a maioria) as alterações nos binários ou nos arquivos de configuração.

Como exemplo dos pacotes instalados, aqui estão os que diferem dos pacotes upstream.

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

E você pode obter uma lista dos arquivos de configuração alterados com:

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

Observe como o navegador chromium é empacotado incorretamente e possui um arquivo listado na lista de arquivos do pacote que não existe.

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

Isso usa os dados do dpkg e evita um grande diretório /.git e fluxo de trabalho.

gdahlm
fonte
Você poderia explicar ", exceto que isso dificulta a observação quando você tem um repositório git de nível inferior com problemas, uma vez que responderá por todos eles". um pouco mais? Não estou entendendo como isso pode causar um problema se o .gitignore rastreia apenas alguns arquivos.
Abhishek Divekar
2
Acredito OP @abhidivekar está dizendo quando você criar outro repo git em dizer /home/$USERentão o .gitem /responderá por qualquer comando git dado para o repo em /home$USERvez de para que [ .girarquivo] em /home/$USER...
George Udosen
Ah entendo. Acho que devo mantê-lo em uma pasta separada então. Ou /
Abhishek Divekar
1
@George Para acessar o .gitdiretório superior na árvore, você só cda ela, ou um subdiretório dele que não tem uma .gitpasta (um diretório normal que é)
cat
2
@abhidivekar Correto, não é um problema se os benefícios superam os problemas, mas é um comportamento inesperado. Não é um bloqueador, apenas uma ressalva.
Gdahlm #
5

Então, eu estive explorando as outras respostas e encontrei um procedimento que funciona para mim:

  • Faça um .gitignoreat /. Isso foi muito mais complicado do que eu pensava, devido à maneira como o Git lida com arquivos da lista de permissões em subpastas. Eu usei esse e esse link para me ajudar.

    ## Source: https://stackoverflow.com/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
    
  • /e execute git init .Até agora, não consegui armazenar a .git/pasta em outro diretório usando o link mencionado por @Ravexina .

  • Corra git add .e git status. Você deve obter uma lista de todos os arquivos de configuração que o 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`.
    
  • Comprometa-se com git commit -m "Initial settings files".

  • Você pode acompanhar as alterações com git log -p -- path/to/fileou gitk path/to/file. Mais discussão sobre isso aqui .

Abhishek Divekar
fonte
2

Se você deseja armazenar coisas confidenciais (como /etc/shadow) no repositório git, verifique se elas não são legíveis por todos os usuários, pois, por padrão, os objetos terão a permissão 444e os diretórios terão a permissão 0755. Você pode alterar a permissão de .gita 700ou colocá-lo em/root

Outro problema é que o git não armazena permissões de arquivo como o sistema de arquivos e não armazena atributos estendidos. Para arquivos, o git armazena apenas se eles são executáveis. Portanto, se você deseja restaurar um arquivo excluído, seu proprietário e grupo serão raiz (se você o fizer como root) e sua permissão será 644ou 755. Pode ser problemático para os arquivos de configuração dos serviços cujo proprietário não é root.

yt7b97q-
fonte