Tworzysz repozytorium Git w / (root) dla ustawień śledzenia?

28

Używam Gita głównie do celów programistycznych, ale właśnie zdałem sobie sprawę, że mogę go użyć do przechowywania wersji plików ustawień, które mam w mojej instalacji Ubuntu.

Moja proponowana konfiguracja to:

  • git init repo w /

  • Dodaj .gitignorena /który ignoruje wszystkie pliki z wyjątkiem określonych ustawień Chcę śledzić.

    Na przykład .gitignoremoże zawierać ( źródło ):

    ## Ignore everything...
    *
    
    ## Except...
    !/etc/default/tlp
    !/etc/crontab
    
  • Ilekroć zmieniam te ustawienia niskiego poziomu, mogę je śledzić.

Czy jest coś, co może pójść nie tak z tą konfiguracją? Czy jądro zawsze musi /mieć tylko określone foldery? Czy to zakłóci funkcjonowanie jakiejkolwiek aplikacji?

Abhishek Divekar
źródło
Być może powinieneś wziąć pod uwagę ~pliki ustawień katalogu domowego, a nie /pliki
Michael Durrant
1
Stary publiczny serwer grex SunOS miał wszystkie swoje pliki rc i kto wie, co jeszcze w starej kontroli źródła (nie jestem pewien, czy był to SCCS czy RCS, ale zdecydowanie starszy niż CVS). Nie widzę z tym problemu.
Joshua
@Mike Durrant: rzeczy /etc/crontabna moim laptopie są zdecydowanie moje, ale rozumiem, co masz na myśli.
Abhishek Divekar
7
Używaj etckeeperi twórz kopie zapasowe.
Przywróć Monikę - M. Schröder
Tylko uważaj, aby nie przypadkowo wystawić / commit tj. / Dev / sda lub podobny: D
quetzalcoatl

Odpowiedzi:

37

Odpowiedź na oba pytania brzmi: nie, możesz utworzyć dowolny katalog w /. jedyne, co może się zdarzyć, to pewne problemy z uprawnieniami z pewnymi ścieżkami przestrzennymi.

Jednak lepiej jest przechowywać .gitkatalog gdzie indziej, coś wygląda jak:

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

Przeczytaj tutaj .

Ravexina
źródło
5
Bardzo interesujące, nie wiedziałem, że możesz to zrobić w git! Dzieki za sugestie.
Abhishek Divekar
To ta sama funkcja, która pozwala śledzić tylko pliki ustawień w / home / user btw. Dodanie aliasu powłoki dodatkowo sprawia, że ​​jest to bardzo wygodne.
Daniel Jour
19

Faktycznie, prawdopodobnie chcesz, aby pliki konfiguracyjne w kontroli wersji /etc/(nie dbają o wpisów z katalogu głównego /, zwłaszcza jak katalogi proclub usrlub binw /), więc może chcesz zainstalować etckeeperpakiet

Możesz także kontrolować wersję niektórych wybranych podkatalogów (jak /usr/share/applications/wspomniano).

Jednak nie zadzieraj z systemem zarządzania pakietami Ubuntu . Być może najczęściej powinieneś wykonać kopię zapasową bieżącej listy zainstalowanych pakietów.

Basile Starynkevitch
źródło
1
Właściwie dbam o pliki, /usr/share/applicationsponieważ od czasu do czasu się z nimi bawię.
Abhishek Divekar
6

Posiadanie repozytorium git w / działa dobrze, z tym wyjątkiem, że utrudnia to zauważenie, gdy masz problemy z repozytorium git na niższym poziomie, ponieważ będzie on odpowiadał na wszystkie z nich.

Uwaga: mniej pracy i prawdopodobnie bardziej użyteczne jest użycie „debsums”

sudo apt-get install debsums

Który pozwoli ci szybko wykryć (większość) zmian w plikach binarnych lub plikach konfiguracyjnych.

Przykładem zainstalowanych pakietów są te, które różnią się od pakietów nadrzędnych.

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

I możesz uzyskać listę zmienionych plików konfiguracyjnych za pomocą:

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

Zwróć uwagę, w jaki sposób przeglądarka chromowa jest niepoprawnie spakowana i zawiera plik na liście plików pakietu, który nie istnieje.

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

Wykorzystuje to dane dpkg i unika dużego katalogu / przepływu pracy.

gdahlm
źródło
Czy możesz wyjaśnić „z wyjątkiem tego, że utrudnia to zauważenie, gdy masz problemy z repozytorium git na niższym poziomie, ponieważ rozwiąże ono wszystkie problemy”. trochę więcej? Nie rozumiem, w jaki sposób może to spowodować problem, jeśli .gitignore śledzi tylko kilka plików.
Abhishek Divekar
2
Wierzę, że @abhidivekar OP mówi, że kiedy tworzysz kolejne repozytorium git, powiedz, /home/$USERże .gitin /odpowie na każde polecenie git podane dla repo in, /home$USERa nie dla tego [ .girpliku] w /home/$USER...
George Udosen
O, rozumiem. Myślę, że powinienem wtedy trzymać go w osobnym folderze. Lub /
Abhishek Divekar
1
@George Aby uzyskać dostęp do .gitkatalogu znajdującego się wyżej w drzewie, wystarczy cdprzejść do niego lub do jego podkatalogu, który nie ma .gitfolderu (to znaczy zwykłego katalogu)
cat
2
@abhidivekar Prawidłowo, nie ma problemu, jeśli korzyści przeważają nad problemami, ale jest to nieoczekiwane zachowanie. Nie bloker, tylko zastrzeżenie.
gdahlm
5

Zbadałem więc inne odpowiedzi i znalazłem procedurę, która działa dla mnie:

  • Zrób .gitignoreco /. Było to o wiele bardziej skomplikowane, niż się spodziewałem, ze względu na sposób, w jaki Git obsługuje pliki z białą listą w podfolderach. Użyłem tego i tego linku, aby mi pomóc.

    ## 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
    
  • Idź do /i uruchom git init .Do tej pory nie byłem w stanie zapisać .git/folderu w innym katalogu za pomocą linku wspomnianego przez @Ravexina .

  • Uruchom git add .i git status. Powinieneś otrzymać listę wszystkich plików ustawień, które śledzi Git.

    If you used the above `.gitignore`, it should track `/etc/crontab`, `/etc/default/tlp`, `/home/USERNAME/.bash_profile`, and `/home/USERNAME/.bashrc`.
    
  • Zaangażuj się z git commit -m "Initial settings files".

  • Możesz śledzić zmiany za pomocą git log -p -- path/to/filelub gitk path/to/file. Więcej dyskusji na ten temat tutaj .

Abhishek Divekar
źródło
2

Jeśli zamierzasz przechowywać wrażliwe rzeczy (np. /etc/shadow) W repozytorium git, powinieneś upewnić się, że nie będą one czytelne dla wszystkich użytkowników, ponieważ domyślnie obiekty będą miały uprawnienia, 444a katalogi będą miały uprawnienia 0755. Możesz zmienić uprawnienia .gitdo 700lub wprowadzić je/root

Innym problemem jest to, że git nie przechowuje uprawnień do plików, takich jak system plików, i nie przechowuje rozszerzonych atrybutów. W przypadku plików git przechowuje tylko to, czy można je wykonać. Więc jeśli chcesz przywrócić usunięty plik, jego właścicielem i grupą będzie root (jeśli robisz to jako root), a jego pozwoleniem będzie 644lub 755. Może to być problematyczne w przypadku plików konfiguracyjnych usług, których właścicielem nie jest root.

yt7b97q-
źródło