Question Emacs + git: validation automatique toutes les 5 minutes


Comment puis-je configurer emacs pour automatiquement git commit chaque fois que je sauvegarde un fichier ouvert ou périodiquement?


6
2018-04-18 06:29


origine


Est-ce que cela ne vainc pas le point de contrôle de la version? - Phoshi
Si vous êtes un programmeur, probablement. Mais pour ceux qui utilisent emacs pour écrire plutôt que du code, je pense que c'est très utile. - Brian Z


Réponses:


Si vous vouliez vous engager à chaque sauvegarde, vous feriez:

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

Vous pourriez probablement utiliser

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

Mais, vous aurez envie d'ajouter quelques contrôles pour vous assurer qu'il est une partie de l'ensemble des fichiers que vous souhaitez engager, sinon chaque tampon vous enregistrez sera ajouté à un référentiel.


3
2018-04-18 22:35



C'est exactement ce que je suis venu chercher ici! - Ryan Fox


j'utilise git-wip pour cela (voir mon répondre sur SO).


4
2018-05-07 15:11





Voici un peu de lisp que j'ai trouvé. Ne fait pas engager / push sur chaque enregistrement, mais les horaires pour l'avenir proche donc si vous enregistrez un tas de petites modifications que vous ne recevez pas un tas de petits commits.

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
2017-07-23 17:16



Il est préférable de copier et coller les informations pertinentes à partir de la page liée plutôt que de les lier au cas où le contenu de la page serait modifié ou déplacé. - Tog


Vous n'avez pas besoin d'emacs pour cela. Vous pouvez écrire un script shell utilisant inotify. Cela pourrait ressembler à ceci:

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

inotifywait fait partie de inoftify-tools.


2
2018-04-18 07:21



ou quelque chose de périodique: 'cron', 'sched de zsh', peu importe - akira
ce que j'ai suggéré n'est pas périodique - Kim


Vous pouvez également utiliser mon moniteur git utilitaire, surtout si vous êtes un utilisateur Haskell.


2
2017-07-23 18:39





Essayez quelque chose comme ça:

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

C'est la façon dont emacs le fait.


-1
2018-04-18 21:09



Vous ne devriez pas utiliser des conseils lorsque save-buffer fournit déjà la variable parfaitement bonne after-save-hook. - Ryan Thompson