在/(根)创建Git存储库以跟踪设置?


28

因此,我主要将Git用于开发目的,但是我意识到可以将其用于存储Ubuntu安装中的设置文件版本。

我建议的设置是:

  • git init 一个回购 /

  • 添加.gitignore/忽略任何文件,除了我想要跟踪特定的设置。

    例如,.gitignore可能包含(source):

    ## Ignore everything...
    *
    
    ## Except...
    !/etc/default/tlp
    !/etc/crontab
    
  • 每当我更改这些低级设置时,我都可以对其进行跟踪。

此设置有什么问题吗?内核是否总是/只需要某些文件夹?它会破坏任何应用程序的功能吗?


也许您应该考虑使用~主目录设置文件而不是/文件
Michael Durrant

1
旧的grex SunOS公共服务器拥有所有的rc文件,谁知道一些旧的源代码管理中还有什么(不确定是SCCS还是RCS,但肯定比CVS早)。我没有看到这个问题。
约书亚记

@迈克·杜兰特(Mike Durrant):/etc/crontab我个人笔记本电脑上的东西绝对是我的,但是我明白你的意思了。
Abhishek Divekar'5

7
使用etckeeper并进行备份。
恢复莫妮卡-M.Schröder'17

请注意不要意外上台/提交/ dev / sda或类似的内容:D
quetzalcoatl

Answers:


37

这两个问题的答案都为否,您可以在中创建所需的任何目录/。唯一可能发生的事情是我猜想某些空间路径的权限问题。

但是最好将.git目录存储在其他位置,如下所示:

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

在这里阅读。


5
非常有趣,我实际上不知道您可以在git中做到这一点!谢谢你的建议。
Abhishek Divekar '17

该功能使您仅跟踪/ home / user btw下的设置文件。另外,添加shell别名使此操作非常方便。
Daniel Jour

19

其实,你可能要在版本控制配置文件/etc/(你不关心的根目录的项目/,尤其是像目录procusrbin/),所以你可能要安装的etckeeper软件包

您还可以对某些选定的子目录进行版本控制(如/usr/share/applications/您提到的那样)。

但是,请不要与Ubuntu 软件包管理系统混为一谈。也许您大多数时候应该备份当前已安装软件包的列表。


1
实际上,我确实关心文件,/usr/share/applications因为我偶尔会把它们弄乱。
Abhishek Divekar '17

6

在/中有一个git repo可以很好地工作,除了它确实使您很难注意到当您有一个较低级别的git repo遇到问题时,因为它会回答所有问题。

注意:使用“ debsums”工作较少,可能更有用

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>

请注意铬浏览器的包装方式不正确,并且在打包文件列表中列出了一个不存在的文件。

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

这将使用dpkg数据,并避免了较大的/.git目录和工作流程。


您能解释一下“除了它确实使您在较低级别的git repo遇到问题时难以注意到,因为它会为所有问题提供答案。” 多一点?我不明白如果.gitignore只跟踪几个文件,它将如何引起问题。
Abhishek Divekar '17

2
我相信当你在说创建另一个混帐回购协议@abhidivekar OP是说/home/$USER,则.git/将回答在回购给出的Git命令中/home$USER,而不是为[ .gir文件],/home/$USER...
乔治Udosen

啊,我明白了。我想我应该将其保存在单独的文件夹中。或/
Abhishek Divekar's

1
@George要访问.git目录较高的树,你只要cd给它,或者它的子目录,其不具有.git文件夹(正常的目录即是)

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 repo中,则应确保所有用户都不可读,因为默认情况下,对象将具有权限444,目录将具有权限0755。您可以更改的权限.git700或把它放在/root

另一个问题是,git不像文件系统那样存储文件权限,也不存储扩展属性。对于文件,git只存储它们是否可执行。因此,如果要还原已删除的文件,则其所有者和组将是root(如果您以root身份进行操作),其许可权将是644755。对于所有者不是root的服务的配置文件,可能会出现问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.