1. Metode tujuan umum menggunakan bazaar &inotify
Ini belum teruji oleh saya tetapi saya menemukan tulisan ini menggunakan bzr
(bazar) &inotifywait
untuk memantau direktori dan mengontrol versi file di dalamnya menggunakan bazaar.
Skrip ini melakukan semua pekerjaan mengawasi direktori untuk perubahan:
#!/bin/bash
# go to checkout repository folder you want to watch
cd path/to/www/parent/www
# start watching the directory for changes recusively, ignoring .bzr dir
# comment is made out of dir/filename
# no output is shown from this, but wrinting a filename instead of /dev/null
# would allow logging
inotifywait –exclude \.bzr -r -q -m -e CLOSE_WRITE \
–format=”bzr commit -m ‘autocommit for %w/%f’” ./ | \
sh 2>/dev/null 1>&2 &
# disown the pid, so the inotify thread will get free from parent process
# and will not be terminated with it
PID=`ps aux | grep inotify | grep CLOSE_WRITE | grep -v grep | awk ‘{print $2}’`
disown $PID
# this is for new files, not modifications, optional
inotifywait –exclude \.bzr -r -q -m -e CREATE \
–format=”bzr add *; bzr commit -m ‘new file added %w/%f’” ./ | \
sh 2>/dev/null 1>&2 &
PID=`ps aux | grep inotify | grep CREATE | grep -v grep | awk ‘{print $2}’`
disown $PID
exit 0;
2. Mengelola /etc
Untuk kasus khusus mengelola /etc
sistem Anda direktori, Anda dapat menggunakan app etckeeper.
etckeeper adalah kumpulan alat untuk membiarkan /etc disimpan dalam repositori git,mercurial, darcs, atau bzr. Itu terhubung ke apt (dan manajer paket lainnya termasuk yum dan pacman-g2) untuk secara otomatis melakukan perubahan yang dibuat ke /etc selama peningkatan paket. Ini melacak metadata file yang biasanya tidak didukung oleh sistem kontrol revisi, tetapi itu penting untuk /etc, seperti izin /etc/shadow. Ini cukup modular dan dapat dikonfigurasi, sekaligus mudah digunakan jika Anda memahami dasar-dasar bekerja dengan kontrol revisi.
Berikut tutorial yang bagus untuk memulainya.
3. Menggunakan git dan incron
Teknik ini menggunakan git
dan incron
. Untuk metode ini, Anda perlu melakukan hal berikut:
A. Buat repo
% mkdir $HOME/git
% cd $HOME/git
% git init
B. Buat $HOME/bin/git-autocommit
skrip
#!/bin/bash
REP_DIR="$HOME/git" # repository directory
NOTIFY_DIR="$HOME/srv" # directory to version
cd $REP_DIR
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git add .
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git commit -a -m "auto"
C. Tambahkan entri ke incrontab
% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit
4. Menggunakan Flashbake
Pilihan lainnya adalah menggunakan alat seperti Flashbake. Flashbake adalah sistem kontrol versi yang digunakan Cory Doctorow (dari BoingBoing yang terkenal) untuk menulis bukunya.
Flashbake menggunakan git untuk melacak perubahan, tetapi berada di antara melakukan pencadangan otomatis dan menggunakan sendiri sistem kontrol versi biasa.
Cory ingin versi tersebut membawa prompt, snapshot di mana dia berada saat komit otomatis terjadi dan apa yang dia pikirkan. Saya dengan cepat membuat sketsa skrip Python untuk menarik informasi kontekstual yang dia inginkan dan mulai meretas bersama skrip shell untuk menggerakkan git, menggunakan keluaran skrip Python untuk komentar komit saat tugas cron menjalankan pembungkus shell.
Sumber daya
- Revisi file otomatis saat diunggah
ZFS segera muncul di benak saya. Itu dapat membuat snapshot - dan ada beberapa proyek untuk membuat snapshot secara otomatis.
Saya pikir Anda berada di jalur yang benar dengan inotify
. Artikel ini merinci penggunaan dasarnya dalam kasus yang mirip dengan kasus Anda. Saya sarankan untuk menggunakannya secara langsung, atau mengkompilasi utilitas tingkat kernel seperti fschange. Ini agak merepotkan, tetapi Anda kemudian dapat mengikat deteksi perubahan ke git commit
atau serupa.
Kedua solusi tersebut memiliki masalah mengandalkan solusi pihak ketiga yang agak tidak sempurna. Jika Anda tidak keberatan mengotori tangan Anda, NodeJS menyediakan fasilitas lintas platform yang sangat baik (fs.watch) untuk tujuan yang tepat ini. Tutorial dasar tentang menonton file untuk perubahan di NodeJS dapat ditemukan di sini. Dalam beberapa lusin baris atau kurang, Anda dapat menulis sesuatu yang mengawasi direktori untuk file, lalu keluar (melalui proses_anak) dan menjalankan git commit
atau serupa (atau bahkan secara manual menambah indeks file versi, jika Anda menyukai pendekatan roll-your-own).
fs.watch
didukung oleh inotify
di linux, tetapi jauh lebih intuitif untuk digunakan. Ada proyek NodeJS lain yang membungkus fungsionalitas menonton file itu dalam berbagai tingkat kenyamanan, seperti yang ini atau yang ini.