Emacs + git: автоматическая фиксация каждые 5 минут

Как настроить emacs на автоматическую фиксацию git при каждом сохранении открытого файла или периодически?

1
задан Brian Burns
21.11.2022 22:22 Количество просмотров материала 2641
Распечатать страницу

6 ответов

Если бы вы хотели совершить каждое сохранение, вы бы сделали:

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

Вероятно, вы могли бы просто использовать

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

но, вы захотите добавить некоторые проверки, чтобы убедиться, что это часть из набора файлов, которые вы хотите зафиксировать, иначе каждый буфер сохранения будут добавлены в репозиторий.

3
отвечен Trey Jackson 2022-11-23 06:10

Я использую git-wip для этого (см. Мой ответ on SO).

4
отвечен rafak 2022-11-23 08:27

вот немного Лиспа, который я нашел. Не совершает / нажимает на каждое сохранение, но планирует его на ближайшее будущее, поэтому, если вы сохраните кучу небольших изменений, вы не получите кучу небольших коммитов.

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))
3
отвечен John Quillan 2022-11-23 10:44

для этого вам не нужен emacs. Можно написать сценарий оболочки, использующий inotify. Это может выглядеть так:

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

inotifywait является частью inoftify-tools.

2
отвечен Kim 2022-11-23 13:01

и git-monitor утилита, если вы являетесь пользователем Haskell.

2
отвечен John Wiegley 2022-11-23 15:18

попробуйте что-то вроде этого:

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

это способ emacs сделать это.

-1
отвечен Bozhidar Batsov 2022-11-23 17:35

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх