Saya ingin menggunakan git untuk merekam semua perubahan pada file.
Apakah ada cara saya dapat mengaktifkan git 'commit' untuk secara otomatis terjadi setiap kali file diperbarui - jadi ada komitmen baru untuk setiap perubahan pada file?
Idealnya saya ingin pengguna saya tidak tahu bahwa git berjalan di belakang layar. Seorang pengguna kemudian berpotensi "membatalkan" perubahan ke file - dan ini bisa dicapai dengan menarik versi sebelumnya dari git.
Jawaban:
Di Linux Anda bisa menggunakan inotifywait untuk secara otomatis menjalankan perintah setiap kali konten file diubah.
Edit: perintah berikut melakukan file.txt segera setelah disimpan:
sumber
-r
flag untukinotifywait
, tetapi perhatikan bahwa kernel memiliki batasan pada jumlah jam tangan inotifywait yang dapat diatur.man inotifywait
akan memberi tahu Anda lebih banyak.Jawaban inotifywait sebelumnya memang bagus, tetapi itu bukan solusi yang cukup lengkap. Seperti yang ditulis, ini adalah komit satu tembakan untuk satu kali perubahan dalam file. Ini tidak berfungsi untuk kasus umum di mana mengedit file membuat inode baru dengan nama asli. inotifywait -m tampaknya mengikuti file dengan inode, bukan dengan nama. Juga, setelah file berubah, itu tidak dipentaskan untuk git commit tanpa git add atau git commit -a . Membuat beberapa penyesuaian, inilah yang saya gunakan di Debian untuk melacak semua perubahan pada file kalender saya:
/etc/rc.local:
/ home / <username> / bin / gitwait:
Ini dapat digeneralisasi untuk menunggu pada daftar file dan / atau direktori, dan proses inotifywait yang sesuai , dan restart setiap inotifywait ketika file diubah.
sumber
Jawaban sebelumnya yang merekomendasikan tidak menunggu pekerjaan ini memberi saya petunjuk ke arah yang benar ketika saya memiliki masalah ini sendiri, jadi saya menulis naskah kecil. Pertama ini hanya bisa menonton seluruh folder secara rekursif (kebalikan dari contoh Lester Buck), tetapi kemudian saya juga ingin menonton file di tempat lain, jadi saya memperluasnya.
Hasilnya adalah sebuah skrip yang saat ini dipanggil
gitwatch
, seperti yang dilakukannya: skrip ini mengawasi file atau folder untuk perubahan (menggunakan inotifywait), dan mengkomitnya ke repositori git.Anda dapat menemukan skrip, info lebih lanjut dan instruksi di github: https://github.com/nevik/gitwatch
sumber
git-wip adalah solusi hebat yang bekerja dengan baik untuk saya. "WIP" adalah singkatan dari "work in progress". Setiap kali Anda menjalankan 'git wip', perubahan tersebut dilakukan ke cabang terpisah. Itu dapat dijalankan pada baris perintah, tetapi ada ekstensi untuk vim dan emacs untuk secara otomatis menjalankan git-wip setiap kali file ditulis.
sumber
Saya ingin melakukan ini di windows, dan menemukan cara terbaik adalah menggunakan Direktori Monitor untuk memeriksa perubahan lalu ketika mendeteksi perubahan, jalankan:
Program: cmd.exe
Params: /CC:\pathToBatchFile.bat
File kumpulan itu berisi:
Saya juga mencoba memiliki perintah lain di sana untuk menambahkan file (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"
), tapi saya rasa saya tidak bisa berfungsi dengan benar.Saya juga membuat kait pasca-komit yang berisi:
(Jika ada konflik maka itu akan membatalkan tarikan dan membatalkan dorong, tetapi tidak ada cara yang jelas untuk mengatakan bahwa telah terjadi - pada akhirnya kami meninggalkan seluruh gagasan karena satu kekurangan ini.)
Perintah curl memberi tahu server saya bahwa itu perlu melakukan tarik pada kode. Semua yang diperlukan untuk menanganinya di php adalah:
Satu-satunya masalah dengan itu adalah itu perlu dijalankan oleh pengguna root, bukan pengguna apache, jadi saya juga harus membuat file
/etc/sudoers.d/
berisi:Bagi saya, saya pikir itu bekerja cukup solid. Direktori Monitor dapat dikonfigurasi untuk dijalankan pada startup dan mulai diminimalkan, dan dapat menonton beberapa folder berbeda
sumber
pembersihan otomatis dengan tanggal dan waktu saat ini.
sumber
Inotify benar-benar terdengar seperti alat yang tepat untuk pekerjaan itu.
Ada alat bernama incron yang bisa persis seperti yang Anda cari. Anda dapat menentukan file atau folder (dan tipe acara, seperti "ubah", "buat", "batalkan tautan") dalam sesuatu seperti crontab, dan perintah untuk dijalankan saat peristiwa semacam itu terjadi.
Berbeda dengan inotifywait (yang akan menjadi analog dari cron orang miskin
sleep 10;do stuff
), ini akan menangkap setiap peristiwa, bukan hanya yang pertama.Saya belum menggunakannya sendiri, tetapi dari dokumentasi itu tidak terlihat terlalu rumit untuk diatur.
sumber
Saya menulis sebuah program, GitPrime , untuk menyediakan penyimpanan otomatis untuk repositori Git lokal Anda. Sekarang mudah untuk memutar kembali sebelum Anda merusaknya! Repositori Bitbucket .
Ini harus bekerja pada platform apa pun yang mendukung bash shell termasuk Windows + Cygwin.
sumber
Jika ada yang mencoba melakukan ini dari Powershell, saya berhasil menggunakan yang berikut:
sumber
Dua solusi yang saya suka adalah penjaga etc - yang dapat disesuaikan dengan direktori khusus selain
/etc
:Dan gitwatch - khususnya instruksi cara menggunakannya
supervisord
.sumber
Jika Anda tahu nama file dan Anda ingin memonitor hanya satu (atau beberapa file), Anda dapat memanggil "git commit" setiap beberapa menit untuk mencapai hal ini. Jika file belum berubah, git hanya akan mengeluh dan Anda harus mengabaikan kesalahan ini tetapi selain itu, tidak akan ada korupsi.
Selain itu, Anda ingin menandai file-file ini sebagai "auto commit" agar dapat melakukan komit juga. Dengan cara ini, pengguna dapat melihat perubahan otomatis dan juga perubahan "logis" yang lebih besar yang disertai dengan komentar komit untuk menjelaskan yang telah berubah sejak komit manual terakhir.
Misalnya, gunakan "AUTOCOMMIT" sebagai pesan komit. Kemudian, Anda dapat menulis alat untuk membersihkan komit ini menggunakan log git (untuk mengetahui revisi untuk membunuh) atau Anda dapat mencoba untuk membuat cabang AUTOCOMMIT menggunakan strategi tekad tabrakan brute force untuk dipalu dalam "komitmen manual".
Pilihan lain adalah menggunakan perintah git level rendah untuk membangun repositori khusus Anda sendiri.
Terakhir, Anda dapat menyalin file ke nama baru ("$ filename.ac") saat melakukan komitmen otomatis untuk membedakan antara versi manual dan otomatis.
sumber
Saya cukup yakin Anda harus mengaitkannya dengan editor apa pun yang digunakan pengguna Anda. Anda bisa menulis sesuatu untuk polling untuk perubahan, tetapi tergantung pada pola penggunaan, frekuensi polling mungkin harus sangat tinggi untuk memastikan itu mengambil perubahan individu daripada beberapa perubahan.
sumber
Kedengarannya seperti Anda sedang mencari sesuatu yang mirip dengan etckeeper , yang dirancang untuk secara otomatis memeriksa semua perubahan Anda ke / etc / * ke git (atau VCS apa pun yang Anda inginkan), tetapi saya tidak melihat alasan mengapa itu tidak dapat digunakan dengan file selain yang ada di / etc.
Jika Anda hanya ingin berurusan dengan satu file tunggal, mungkin itu tidak akan sempurna, tetapi jika Anda ingin melacak semua yang ada di direktori tertentu, saya pikir ada baiknya memeriksa.
sumber
Skrip ini tidak berjalan ketika pengguna mengubah file, tetapi bisa dijalankan sebagai tugas cron (dengan menjatuhkannya ke direktori /etc/cron.*), yang juga merupakan solusi yang masuk akal.
Skrip ini akan mengulangi melalui direktori / srv / www Anda (ubah ke tempat semua situs Anda disimpan), tambahkan, komit, dan dorong semua file, dan catat semuanya ke /var/log/gitlog.txt
sumber
Saya memiliki masalah yang sama dan pada launchd mac memberi Anda solusi yang bagus. itu akan menonton file atau direktori dan jika ada perubahan Anda dapat menjalankan aplikasi atau apa pun ...
sumber
Saya membuat skrip shell kecil ini untuk memonitor status file dan memicu perintah seperti git commit saat membangun kesuksesan.
Jangan ragu untuk mengunduh dan mencobanya.
https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh
sumber
Ini tidak memuaskan bagian "Idealnya" dari pertanyaan, tetapi ini adalah pertanyaan terdekat yang saya lihat dengan jawaban yang saya inginkan, jadi saya pikir itu bisa masuk ke sini. Posting stackoverflow pertama saya, jadi minta maaf jika saya salah.
Script berikut memastikan komit otomatis pada perubahan diselamatkan, tetapi tidak prompt pengguna untuk melakukan masukan. (Saya menyadari skenario saya sedikit berbeda dengan git-noob).
sumber
Untuk Windows
Menurut artikel ini tentang autocommit , Anda harus membuat
.bat
file dengan konten:dan jalankan dengan
Task Scheduler
. Jika Anda tidak tahu bagaimana melakukan langkah-demi-langkah, lihat artikel itu.sumber