이맥스 + 자식 : 5 분마다 자동 커밋


7

열린 파일을 저장할 때마다 또는 주기적으로 자동 커밋하도록 emacs를 설정하려면 어떻게해야합니까?


6
그게 버전 관리의 요점을 물리 치지 않습니까?
Phoshi

2
프로그래머라면 아마 그렇습니다. 그러나 emacs를 사용하여 코드 대신 코드를 작성하는 사람들에게는 이것이 매우 유용하다고 생각합니다.
Brian Z

답변:


3

모든 저장을 원한다면 다음을 수행하십시오.

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

그러나 커밋하려는 파일 세트의 일부인지 확인하기 위해 검사를 추가해야합니다. 그렇지 않으면 저장 한 모든 버퍼가 저장소에 추가됩니다.


이것이 바로 내가 찾던 것입니다!
Ryan Fox


3

여기 내가 찾은 약간의 lisp가 있습니다. 모든 저장시 커밋 / 푸시를 수행하지는 않지만 가까운 시일 내에 예약하므로 작은 편집을 많이 저장하면 작은 커밋이 발생하지 않습니다.

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

페이지 내용이 변경되거나 이동하는 경우 링크 된 페이지보다는 링크 된 페이지에서 관련 정보를 복사하여 붙여 넣는 것이 좋습니다.
Tog

2

당신은 전혀 이맥스가 필요하지 않습니다. inotify를 사용하는 쉘 스크립트를 작성할 수 있습니다. 다음과 같이 보일 수 있습니다 :

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

inotifywait는 inoftify-tools의 일부입니다.


또는 다른주기적인 것 : 'cron', 'zsh에서 스케쥴 됨', 무엇이든
akira

내가 제안한 것은 주기적이지 않습니다
Kim


-1

다음과 같이 해보십시오 :

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

이맥스 방법입니다.


1
save-buffer이미 완벽하게 좋은 변수를 제공 할 때 조언을 사용해서는 안됩니다 after-save-hook.
Ryan Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.