Создание репозитория Git в / (root) для настроек отслеживания?

28

Поэтому я использую Git в основном для целей разработки, но я только что понял, что могу использовать его для хранения версий файлов настроек, которые у меня есть при установке Ubuntu.

Моя предлагаемая установка:

  • git init репо в /

  • Добавить .gitignoreпри /этом игнорирует любые файлы, кроме определенных настроек, которые я хочу отслеживать.

    Например, .gitignoreможет содержать ( источник ):

    ## Ignore everything...
    *
    
    ## Except...
    !/etc/default/tlp
    !/etc/crontab
    
  • Всякий раз, когда я изменяю эти настройки низкого уровня, я могу отслеживать их.

Что-нибудь может пойти не так с этой настройкой? Всегда ли ядру нужно /иметь только определенные папки? Это испортит работу каких-либо приложений?

Абхишек Дивекар
источник
Возможно, вам следует рассмотреть ~файлы настроек вашего домашнего каталога, а не /файлы
Майкл Даррант
1
На старом общедоступном сервере grex SunOS были все его rc-файлы, и кто знает, что еще находится в каком-то старом контроле исходного кода (не уверен, что это был SCCS или RCS, но определенно старше, чем CVS). Я не вижу проблемы с этим.
Джошуа
@ Майк Даррант: что-то вроде /etc/crontabмоего личного ноутбука, безусловно, мое, но я понимаю, что вы имеете в виду.
Абхишек Дивекар
7
Используйте etckeeperи делайте резервные копии.
Восстановить Монику - М. Шредер
Только будьте осторожны , чтобы случайно не на стадии / фиксации т.е. / DEV / SDA или аналогичные: D
Кетцалькоатль

Ответы:

37

Ответ на оба ваших вопроса - нет, вы можете создать любой каталог, который хотите в /. единственное, что может случиться, это некоторые проблемы с разрешениями с некоторыми пространственными путями, я думаю.

Однако лучше хранить .gitкаталог в другом месте, что-то похожее на:

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

Читайте здесь .

Ravexina
источник
5
Очень интересно, я даже не знал, что ты можешь сделать это в Git! Спасибо за предложение.
Абхишек Дивекар
Это та же самая функция, которая позволяет вам отслеживать только файлы настроек в / home / user btw. Добавление псевдонима оболочки делает это очень удобным.
Даниэль Жур
19

На самом деле, вы , вероятно , хотите файлы конфигурации управления версиями в /etc/(вы не заботитесь о записях в корневом каталоге /, в частности каталогов , например , procили , usrили binв /) , так что вы можете установить etckeeperпакет

И вы также можете управлять версиями некоторых выбранных подкаталогов (как /usr/share/applications/вы упомянули).

Однако не связывайтесь с системой управления пакетами Ubuntu . Возможно, вам в основном следует сделать резервную копию текущего списка установленных пакетов.

Василий Старынкевич
источник
1
Я на самом деле забочусь о файлах, /usr/share/applicationsпотому что время от времени возиться с ними.
Абхишек Дивекар
6

Наличие git-репо в / работает нормально, за исключением того, что трудно заметить, когда у вас есть git-репо более низкого уровня с проблемами, поскольку он ответит на все из них.

Примечание: это менее трудоемко и, вероятно, более полезно использовать «дебсум»

sudo apt-get install debsums

Что позволит вам быстро обнаружить (большинство) изменений в двоичных файлах или в файлах конфигурации.

В качестве примера из установленных пакетов здесь приведены те, которые отличаются от исходящих пакетов.

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

И вы можете получить список измененных файлов конфигурации с:

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

Обратите внимание, что браузер chromium неправильно упакован и содержит файл, который отсутствует в списке файлов пакета.

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

Это использует данные dpkg и позволяет избежать большого каталога /.git и рабочего процесса.

gdahlm
источник
Не могли бы вы объяснить «за исключением того, что трудно заметить, когда у вас есть git-репо более низкого уровня с проблемами, поскольку он ответит на все из них». еще немного? Я не понимаю, как это может вызвать проблемы, если .gitignore отслеживает только несколько файлов.
Абхишек Дивекар
2
Я полагаю, что @abhidivekar OP говорит, что когда вы создаете другое git-репо в скажем, /home/$USERтогда .gitin /будет отвечать за любую команду git, переданную для репо, /home$USERа не для этого [ .girфайла] в /home/$USER...
Джордж Удосен
Ах я вижу. Я думаю, что я должен просто держать его в отдельной папке. Или /
Абхишек Дивекар
1
@ George Чтобы получить доступ к .gitкаталогу выше в дереве, вы просто cdк нему или его подкаталогу, у которого нет .gitпапки (нормальный каталог, который есть)
cat
2
@abhidivekar Правильно, это не проблема, если выгоды перевешивают проблемы, но это неожиданное поведение. Не блокатор, просто предостережение.
gdahlm
5

Поэтому я изучал другие ответы и нашел процедуру, которая работает для меня:

  • Сделать .gitignoreв /. Это было намного сложнее, чем я думал, из-за способа, которым Git обрабатывает файлы из белого списка в подпапках. Я использовал эту и эту ссылку, чтобы помочь мне.

    ## 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
    
  • Перейдите /и запустите. git init .Пока я не смог сохранить .git/папку в другом каталоге, используя ссылку, указанную @Ravexina .

  • Беги git add .и git status. Вы должны получить список всех файлов настроек, которые отслеживает Git.

    If you used the above `.gitignore`, it should track `/etc/crontab`, `/etc/default/tlp`, `/home/USERNAME/.bash_profile`, and `/home/USERNAME/.bashrc`.
    
  • Совершить с git commit -m "Initial settings files".

  • Вы можете отслеживать изменения с помощью git log -p -- path/to/fileили gitk path/to/file. Подробнее об этом здесь .

Абхишек Дивекар
источник
2

Если вы собираетесь хранить конфиденциальные данные (например /etc/shadow) в репозитории git, вы должны убедиться, что они недоступны для чтения всем пользователям, поскольку по умолчанию объекты будут иметь разрешение, 444а каталоги - разрешение 0755. Вы можете изменить разрешение .gitна 700или положить его в/root

Другая проблема заключается в том, что git не хранит права доступа к файлам, такие как файловая система, и не хранит расширенные атрибуты. Для файлов git хранит только исполняемые файлы. Поэтому, если вы хотите восстановить удаленный файл, его владелец и группа будут root (если вы сделаете это как root), а его разрешение будет 644или 755. Это может быть проблематично для файлов конфигурации служб, владельцем которых не является root.

yt7b97q-
источник