Tạo repo Git tại / (root) để theo dõi cài đặt?


28

Vì vậy, tôi sử dụng Git chủ yếu cho mục đích phát triển, nhưng tôi nhận ra rằng tôi có thể sử dụng nó để lưu trữ các phiên bản của tệp cài đặt tôi có trong quá trình cài đặt Ubuntu.

Thiết lập đề xuất của tôi là:

  • git init một repo tại /

  • Thêm .gitignorevào /đó bỏ qua bất kỳ tệp nào ngoại trừ cài đặt cụ thể tôi muốn theo dõi.

    Ví dụ: .gitignorecó thể chứa ( nguồn ):

    ## Ignore everything...
    *
    
    ## Except...
    !/etc/default/tlp
    !/etc/crontab
    
  • Bất cứ khi nào tôi thay đổi các cài đặt cấp thấp này, tôi có thể theo dõi chúng.

Có bất cứ điều gì có thể đi sai với thiết lập này? Có phải kernel luôn cần /chỉ có một số thư mục nhất định? Nó sẽ làm rối loạn chức năng của bất kỳ ứng dụng?


Có lẽ bạn nên xem xét ~các tệp cài đặt thư mục nhà của mình chứ không phải /các tệp
Michael Durrant

1
Máy chủ công cộng grex SunOS cũ có tất cả các tệp RC của nó và ai biết những gì khác trong một số kiểm soát nguồn cũ (không chắc đó là SCCS hay RCS, nhưng chắc chắn cũ hơn CVS). Tôi không thấy một vấn đề với điều này.
Joshua

@Mike Durrant: những thứ như /etc/crontabtrên máy tính xách tay cá nhân của tôi chắc chắn là của tôi, nhưng tôi hiểu ý của bạn.
Abhishek Divekar

7
Sử dụng etckeepervà tạo bản sao lưu.
Phục hồi Monica - M. Schröder

Chỉ cần cẩn thận để không vô tình đến giai đoạn / cam kết tức là / dev / sda hoặc tương tự: D
quetzalcoatl

Câu trả lời:


37

Câu trả lời cho cả hai câu hỏi của bạn là không, bạn có thể tạo bất kỳ thư mục nào bạn muốn trong /. điều duy nhất có thể xảy ra là một số vấn đề về quyền với một số đường dẫn không gian tôi đoán.

Tuy nhiên, tốt hơn là lưu trữ .gitthư mục ở một nơi khác, một cái gì đó trông giống như:

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

Đọc ở đây .


5
Rất thú vị, tôi thực sự không biết bạn có thể làm điều này trong git! Cám ơn vì sự gợi ý.
Abhishek Divekar

Đó là tính năng tương tự cho phép bạn chỉ theo dõi cài đặt các tệp trong / home / user btw. Thêm một bí danh vỏ cũng làm cho điều này rất thuận tiện.
Daniel Jour

19

Trên thực tế, có thể bạn muốn các file cấu hình điều khiển phiên bản trong /etc/(bạn không quan tâm đến các mục của thư mục gốc /, đặc biệt là các thư mục như prochoặc usrhoặc bintrong /), do đó bạn có thể muốn cài đặt các etckeepergói

Và bạn cũng có thể kiểm soát phiên bản một số thư mục con được chọn (như /usr/share/applications/bạn đã đề cập).

Tuy nhiên, đừng gây rối với hệ thống quản lý gói Ubuntu . Có lẽ bạn chủ yếu nên sao lưu danh sách các gói đã cài đặt hiện tại.


1
Tôi thực sự quan tâm đến các tập tin trong /usr/share/applicationskhi tôi thỉnh thoảng loay hoay với chúng.
Abhishek Divekar

6

Có một git repo trong / hoạt động tốt, ngoại trừ việc nó làm cho khó nhận thấy khi bạn có một repo git cấp thấp hơn với các vấn đề vì nó sẽ trả lời cho tất cả chúng.

Lưu ý: Việc sử dụng 'debsums' sẽ ít hữu ích hơn và có thể hữu ích hơn

sudo apt-get install debsums

Điều này sẽ cho phép bạn nhanh chóng phát hiện (hầu hết) các thay đổi trong tệp nhị phân hoặc trong các tệp cấu hình.

Như một ví dụ từ các gói được cài đặt ở đây là những gói khác với các gói ngược dòng.

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

Và bạn có thể nhận được một danh sách các tập tin cấu hình thay đổi với:

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

Lưu ý cách trình duyệt crom được đóng gói không đúng cách và có một tệp được liệt kê trong danh sách tệp gói không tồn tại.

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

Điều này sử dụng dữ liệu dpkg và tránh một thư mục và quy trình làm việc lớn.


Bạn có thể giải thích "ngoại trừ việc nó làm cho khó nhận thấy khi bạn có một repo git cấp thấp hơn với các vấn đề vì nó sẽ trả lời cho tất cả chúng." thêm chút nữa? Tôi không hiểu làm thế nào nó có thể gây ra vấn đề nếu .gitignore chỉ theo dõi một vài tệp.
Abhishek Divekar

2
Tôi tin rằng OP @abhidivekar đang nói khi bạn tạo một repo git trong tiếng nói /home/$USERthì .gittrong /sẽ trả lời cho bất kỳ lệnh git đưa ra cho các repo trong /home$USERhơn là cho rằng [ .girfile] trong /home/$USER...
George Udosen

Ah tôi thấy. Tôi nghĩ rằng tôi chỉ nên giữ nó trong một thư mục riêng biệt sau đó. Hoặc /
Abhishek Divekar

1
@George Để truy cập .gitthư mục cao hơn trong cây, bạn chỉ cần cdvào nó hoặc thư mục con của nó không có .gitthư mục (đó là một thư mục bình thường)
mèo

2
@abhidivekar Đúng, nó không phải là vấn đề nếu lợi ích vượt trội hơn các vấn đề nhưng đó là hành vi bất ngờ. Không phải là một chặn, chỉ là một cảnh báo.
gdahlm

5

Vì vậy, tôi đã khám phá các câu trả lời khác và tôi đã tìm thấy một quy trình phù hợp với mình:

  • Làm một .gitignoretại /. Điều này phức tạp hơn nhiều so với tôi nghĩ, bởi vì cách Git xử lý các tập tin danh sách trắng trong các thư mục con. Tôi sử dụng nàynày liên kết để giúp tôi.

    ## 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
    
  • Tới /và chạy git init .Cho đến nay, tôi đã không thể lưu trữ các .git/thư mục trong thư mục khác bằng cách sử dụng liên kết được đề cập bởi @Ravexina .

  • Chạy git add .git status. Bạn sẽ nhận được một danh sách tất cả các tệp cài đặt mà Git đang theo dõi.

    If you used the above `.gitignore`, it should track `/etc/crontab`, `/etc/default/tlp`, `/home/USERNAME/.bash_profile`, and `/home/USERNAME/.bashrc`.
    
  • Cam kết với git commit -m "Initial settings files".

  • Bạn có thể theo dõi các thay đổi với git log -p -- path/to/filehoặc gitk path/to/file. Thảo luận thêm về điều này ở đây .


2

Nếu bạn sẽ lưu trữ những thứ nhạy cảm (như /etc/shadow) trong git repo, bạn nên đảm bảo rằng tất cả người dùng không thể đọc được, vì theo mặc định, các đối tượng sẽ có quyền 444và thư mục sẽ có quyền 0755. Bạn có thể thay đổi sự cho phép của .gitđể 700hoặc đặt nó trong/root

Một vấn đề khác là git không lưu trữ các quyền của tệp như hệ thống tệp và nó không lưu các thuộc tính mở rộng. Đối với các tệp, git chỉ lưu trữ cho dù chúng có thể thực thi được. Vì vậy, nếu bạn muốn khôi phục một tệp đã bị xóa, chủ sở hữu và nhóm của nó sẽ là root (nếu bạn thực hiện nó với quyền root) và sự cho phép của nó sẽ là 644hoặc 755. Có thể có vấn đề đối với các tệp cấu hình của dịch vụ có chủ sở hữu không phải là root.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.