Emacs 如何同步运行magit

Emacs 如何同步运行magit,emacs,elisp,magit,Emacs,Elisp,Magit,我得到: (let ((default-directory "/home/vision/")) (magit-pull) (magit-fetch "upstream") (magit-merge "upstream/master") (magit-push)) 如何等待获取完成?Magit是git的一个交互式前端,因此像Magit fetch这样的东西实际上并不打算从您的代码中运行。。。但是如果您确实坚持,快速查看一下代码就会发现,magit process是一个变量,它在进

我得到:

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

如何等待获取完成?

Magit是git的一个交互式前端,因此像
Magit fetch
这样的东西实际上并不打算从您的代码中运行。。。但是如果您确实坚持,快速查看一下代码就会发现,
magit process
是一个变量,它在进程运行时保存进程,并且在进程完成时会被清除。因此,您可以将其用于等待该情况发生的循环:

Running git fetch upstream
Git is already running
但这确实在推动它——例如,当获取失败时会发生什么

顺便说一句,您可以做的另一件事是查看源代码,它是
magit fetch
案例中的一行函数:

(progn
  (magit-fetch "upstream")
  (while magit-process (sleep-for 0.25))
  (magit-fetch "upstream"))
并编写使用非异步版本的代码:

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

(你可以建议一个补丁来添加一个可选的标志参数,但是对于一个交互式工具来说,这似乎是一个不确定的特性…)

这个问题似乎与你的问题有关。 您正试图通过两种方法解决从emacs内部使用git的问题:

  • 将bash脚本逐行转换为emacs lisp
  • 使用现有库与git交互
您的第一种方法显然不起作用,而您的第二种方法似乎更好。然而,magit并不意味着要从您的代码中使用。由于magit只对前端感兴趣,因此这些功能随时可能发生变化。任何不破坏功能的更改都将被视为安全的

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

我想我必须在这里使用一些没有异步的东西,magit并不像@Eli Barzilay所说的那样是为它而设计的。没有概念上的最终目标,我只需要同步一些git存储库,或者添加一些附加脚本,但这很简单,直到我发现如何使用elisp改进它,例如购买添加配置文件。
(progn
  (apply 'magit-run-git "fetch" "upstream" magit-custom-options)
  (apply 'magit-run-git "fetch" "upstream" magit-custom-options))