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?


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.


Inilah yang saya cari di sini!
Ryan Fox


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))

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.


atau hal periodik lainnya: 'cron', 'sched from zsh', terserah
akira

apa yang saya sarankan tidak berkala
Kim


-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.


1
Anda seharusnya tidak menggunakan saran ketika save-buffersudah memberikan variabel yang sangat baik after-save-hook.
Ryan Thompson
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.