Emacs + git: komit otomatis setiap 5 menit

7

Bagaimana saya mengatur emacs untuk secara otomatis menerima komit setiap kali saya menyimpan file terbuka atau secara berkala?

Tanami
sumber
6
Bukankah itu agak mengalahkan titik kendali versi?
Phoshi
2
Jika Anda seorang programmer, mungkin. Tetapi bagi mereka yang menggunakan emacs untuk menulis daripada kode, saya pikir ini cukup berguna.
Brian Z

Jawaban:

3

Jika Anda ingin berkomitmen setiap kali menyimpan, Anda akan melakukan:

(add-hook 'after-save-hook 'my-commit-on-save)
(defun my-commit-on-save ()
   "commit the buffer"
   ...your-code-goes-here...)

Kemungkinan Anda hanya bisa menggunakan

(defun my-commit-on-save ()
   "commit the buffer"
   (call-interactively 'vc-next-action))

Tapi, Anda ingin menambahkan beberapa cek untuk memastikan itu adalah bagian dari set file yang ingin Anda komit, jika tidak setiap buffer yang Anda simpan akan ditambahkan ke repositori.

Trey Jackson
sumber
Inilah yang saya cari di sini!
Ryan Fox
4

Saya menggunakan git-wip untuk itu (lihat jawaban saya di SO).

rafak
sumber
3

Berikut adalah sedikit cadel yang saya temukan. Tidak melakukan komit / mendorong pada setiap simpan, tetapi jadwalkan untuk waktu dekat jadi jika Anda menyimpan banyak suntingan kecil Anda tidak mendapatkan banyak komitmen kecil.

https://gist.github.com/defunkt/449668

;; Automatically add, commit, and push when files change.

(defvar autocommit-dir-set '()
  "Set of directories for which there is a pending timer job")

(defun autocommit-schedule-commit (dn)
  "Schedule an autocommit (and push) if one is not already scheduled for the given dir."
  (if (null (member dn autocommit-dir-set))
      (progn
        (run-with-idle-timer
         10 nil
         (lambda (dn)
           (setq autocommit-dir-set (remove dn autocommit-dir-set))
           (message (concat "Committing org files in " dn))
           (shell-command (concat "cd " dn " && git commit -m 'Updated org files.'"))
           (shell-command (concat "cd " dn " && git push & /usr/bin/true")))
         dn)
        (setq autocommit-dir-set (cons dn autocommit-dir-set)))))

(defun autocommit-after-save-hook ()
  "After-save-hook to 'git add' the modified file and schedule a commit and push in the idle loop."
  (let ((fn (buffer-file-name)))
    (message "git adding %s" fn)
    (shell-command (concat "git add " fn))
    (autocommit-schedule-commit (file-name-directory fn))))

(defun autocommit-setup-save-hook ()
  "Set up the autocommit save hook for the current file."
  (interactive)
  (message "Set up autocommit save hook for this buffer.")
  (add-hook 'after-save-hook 'autocommit-after-save-hook nil t))
John Quillan
sumber
Lebih baik menyalin dan menempelkan informasi yang relevan dari halaman yang ditautkan daripada hanya menautkannya jika konten halaman berubah atau bergerak.
Tog
2

Anda tidak perlu emacs untuk itu sama sekali. Anda dapat menulis skrip shell yang menggunakan inotify. Itu bisa terlihat seperti ini:

while true; do
    inotifywait -e modify FILES...
    git commit ....
done

inotifywait adalah bagian dari inoftify-tools.

Kim
sumber
atau hal periodik lainnya: 'cron', 'sched from zsh', terserah
akira
apa yang saya sarankan tidak berkala
Kim
2

Anda juga dapat menggunakan utilitas git-monitor saya , terutama jika Anda adalah pengguna Haskell.

John Wiegley
sumber
-1

Coba sesuatu seperti ini:

(defadvice save-buffer (after commit-buffer-now activate)
  (when buffer-file-name (your commit code goes here)))

Ini adalah cara emacs untuk melakukannya.

Bozhidar Batsov
sumber
1
Anda seharusnya tidak menggunakan saran ketika save-buffersudah memberikan variabel yang sangat baik after-save-hook.
Ryan Thompson