Membuat repo Git di / (root) untuk pengaturan pelacakan?


28

Jadi saya menggunakan Git sebagian besar untuk tujuan pengembangan, tetapi saya baru sadar bahwa saya bisa menggunakannya untuk menyimpan versi file pengaturan yang saya miliki di instalasi Ubuntu saya.

Pengaturan yang saya usulkan adalah:

  • git init sebuah repo di /

  • Tambahkan .gitignoreat at /yang mengabaikan file apa pun kecuali pengaturan spesifik yang ingin saya lacak.

    Misalnya, .gitignorebisa mengandung ( sumber ):

    ## Ignore everything...
    *
    
    ## Except...
    !/etc/default/tlp
    !/etc/crontab
    
  • Setiap kali saya mengubah pengaturan level rendah ini, saya bisa melacaknya.

Apakah ada yang salah dengan pengaturan ini? Apakah kernel selalu perlu /hanya memiliki folder tertentu? Apakah ini akan mengacaukan fungsi aplikasi apa pun?


Mungkin Anda harus mempertimbangkan ~file pengaturan direktori home Anda daripada /file
Michael Durrant

1
Server publik lama grex SunOS memiliki semua file rc-nya dan siapa yang tahu apa lagi dalam beberapa kontrol sumber lama (tidak yakin apakah itu SCCS atau RCS, tapi jelas lebih tua dari CVS). Saya tidak melihat masalah dengan ini.
Yosua

@ Mike Durrant: hal-hal seperti /etc/crontabdi laptop pribadi saya jelas milik saya, tapi saya mengerti maksud Anda.
Abhishek Divekar

7
Gunakan etckeeperdan buat cadangan.
Pasang kembali Monica - M. Schröder

Berhati-hatilah untuk tidak secara tidak sengaja menuju panggung / melakukan mis / dev / sda atau serupa: D
quetzalcoatl

Jawaban:


37

Jawaban untuk kedua pertanyaan Anda adalah tidak, Anda dapat membuat direktori yang Anda inginkan di /. satu-satunya hal yang bisa terjadi adalah beberapa masalah izin dengan beberapa jalur spasial kurasa.

Namun lebih baik menyimpan .gitdirektori di tempat lain, sesuatu seperti:

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

Baca di sini .


5
Sangat menarik, saya sebenarnya tidak tahu Anda bisa melakukan ini di git! Terima kasih untuk sarannya.
Abhishek Divekar

Itu fitur yang sama yang memungkinkan Anda melacak hanya pengaturan file di bawah / home / user btw. Menambahkan alias shell juga membuat ini sangat nyaman.
Daniel Jour

19

Sebenarnya, Anda mungkin ingin kontrol versi file-file konfigurasi di /etc/(Anda tidak peduli tentang entri dari direktori root /, terutama direktori seperti procatau usratau bindi /) sehingga Anda mungkin ingin menginstal etckeeperpaket

Dan Anda juga dapat mengontrol versi beberapa subdirektori yang dipilih (seperti /usr/share/applications/yang Anda sebutkan).

Namun, jangan main-main dengan sistem manajemen paket Ubuntu . Mungkin Anda sebaiknya mencadangkan daftar paket yang diinstal saat ini.


1
Saya benar-benar peduli tentang file /usr/share/applicationskarena saya kadang-kadang mengacaukannya.
Abhishek Divekar

6

Memiliki git repo dalam / berfungsi dengan baik, kecuali bahwa itu membuat sulit untuk melihat ketika Anda memiliki git repo tingkat rendah dengan masalah karena akan menjawab untuk mereka semua.

Catatan: Ini kurang berhasil dan mungkin lebih bermanfaat untuk menggunakan 'debsums'

sudo apt-get install debsums

Yang akan memungkinkan Anda untuk dengan cepat mendeteksi (sebagian besar) perubahan dalam binari atau dalam file konfigurasi.

Sebagai contoh dari paket yang diinstal di sini adalah yang berbeda dari paket hulu.

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

Dan Anda bisa mendapatkan daftar file konfigurasi yang diubah dengan:

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

Perhatikan bagaimana chromium-browser dikemas secara tidak benar dan dan memiliki file yang tercantum dalam daftar file paket yang tidak ada.

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

Ini menggunakan data dpkg dan menghindari direktori / alur kerja /.git yang besar.


Bisakah Anda menjelaskan "kecuali bahwa hal itu membuat sulit untuk melihat ketika Anda memiliki git repo tingkat rendah dengan masalah karena itu akan menjawab semua dari mereka." sedikit lagi? Saya tidak mengerti bagaimana ini dapat menyebabkan masalah jika .gitignore hanya melacak beberapa file.
Abhishek Divekar

2
Saya percaya @abhidivekar OP mengatakan ketika Anda membuat git repo lain di katakan /home/$USERmaka .gitin /akan menjawab untuk setiap perintah git yang diberikan untuk repo itu /home$USERdaripada untuk [ .girfile] dalam /home/$USER...
George Udosen

Ah saya mengerti. Saya pikir saya harus menyimpannya di folder yang terpisah. Atau /
Abhishek Divekar

1
@ George Untuk mengakses .gitdirektori yang lebih tinggi di pohon, Anda cukup cdke sana, atau subdirektori yang tidak memiliki .gitfolder (direktori normal)
cat

2
@abhidivekar Benar, ini bukan masalah jika manfaatnya melebihi masalah tetapi itu adalah perilaku yang tidak terduga. Bukan pemblokir, hanya peringatan.
gdahlm

5

Jadi saya telah menjelajahi jawaban lain dan saya menemukan prosedur yang cocok untuk saya:

  • Buat .gitignoredi /. Ini jauh lebih rumit daripada yang saya kira, karena cara Git menangani file yang masuk daftar putih di subfolder. Saya menggunakan ini dan ini Link untuk membantu saya.

    ## 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
    
  • Pergi ke /dan jalankan git init .Sejauh ini, saya tidak dapat menyimpan .git/folder di direktori lain menggunakan tautan yang disebutkan oleh @Ravexina .

  • Jalankan git add .dan git status. Anda harus mendapatkan daftar semua file pengaturan yang dilacak Git.

    If you used the above `.gitignore`, it should track `/etc/crontab`, `/etc/default/tlp`, `/home/USERNAME/.bash_profile`, and `/home/USERNAME/.bashrc`.
    
  • Berkomitmen dengan git commit -m "Initial settings files".

  • Anda dapat melacak perubahan dengan git log -p -- path/to/fileatau gitk path/to/file. Lebih banyak diskusi tentang ini di sini .


2

Jika Anda akan menyimpan hal-hal sensitif (seperti /etc/shadow) di repo git, Anda harus memastikan itu tidak dapat dibaca oleh semua pengguna, karena secara default objek akan memiliki izin 444dan direktori akan memiliki izin 0755. Anda dapat mengubah izin .gituntuk 700atau memasukkannya ke dalam/root

Masalah lain adalah bahwa git tidak menyimpan izin file seperti sistem file, dan itu tidak menyimpan atribut yang diperluas. Untuk file, git hanya menyimpan apakah file itu dapat dieksekusi. Jadi jika Anda ingin mengembalikan file yang dihapus, pemilik dan grupnya akan menjadi root (jika Anda melakukannya sebagai root), dan izinnya adalah 644atau 755. Mungkin bermasalah untuk file konfigurasi layanan yang pemiliknya tidak di-root.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.