如何同步运行magit

时间:2012-06-21 05:00:57

标签: emacs elisp magit

(let ((default-directory "/home/vision/"))
  (magit-pull)
  (magit-fetch "upstream")
  (magit-merge "upstream/master")
  (magit-push))

我得到了:

Running git fetch upstream
Git is already running

我如何等待获取结束?

2 个答案:

答案 0 :(得分:5)

Magit旨在作为git的交互式前端,所以像magit-fetch这样的东西并不是真的要从你的代码中运行......但如果你真的坚持,快速浏览一下代码会告诉你magit-process是一个变量,它在进程运行时保存进程,并在完成后清除它。因此,您可以使用一个等待直到发生的循环:

(progn
  (magit-fetch "upstream")
  (while magit-process (sleep-for 0.25))
  (magit-fetch "upstream"))

但这确实是推动它 - 例如,当提取失败时会发生什么?

BTW,你可以做的另一件事是查看magit-fetch案例中的单行函数源:

(apply 'magit-run-git-async "fetch" remote magit-custom-options)

并编写使用非异步版本的代码:

(progn
  (apply 'magit-run-git "fetch" "upstream" magit-custom-options)
  (apply 'magit-run-git "fetch" "upstream" magit-custom-options))

(你可以建议一个补丁来添加一个可选的flag参数,但这似乎是交互式工具的一个iffy功能...)

答案 1 :(得分:0)

这个问题似乎与您的previous question有关。 您正试图通过两种方法解决在emacs中使用git的问题:

  • 逐行将bash脚本转换为emacs lisp
  • 使用现有库与git进行交互

你的第一种方法显然不起作用,你的第二种方法似乎更好。但是,不能在代码中使用magit。由于magit只对前端感兴趣,因此功能可能随时发生变化。任何不破坏功能的更改都将被视为安全。

如果你解释了你的最终目标是什么,这将是有用的,这样你就可以得到更好的答案。 你需要的可能是一个简单的git别名,你可以从emacs调用。