4

我厌恶任何普通开发人员应该做的手动、乏味和重复性的任务。最近我意识到——在大量 git repos 上创建拉取请求占用了我太多的时间。大多数时候,您必须一遍又一遍地遵循几乎完全相同的步骤:

  • 登录 git 提供者的网络客户端 - 我们使用 Stash
  • 单击,单击,单击,直到找到“创建拉取请求”按钮,然后单击它
  • 选择一个分支 - 通常它是一个刚刚被推送的分支
  • 选择一个目标分支 - 大多数时候它是“开发”
  • 添加审阅者 - 大多数时候完全相同的人
  • 添加描述 - 可选

在某个时候,我开始怀疑是否可以在不使用 Web 客户端的情况下完成所有这些工作。这似乎是可能的。Stash 和 Bitbucket 有一个 apiGithub 也有一个(虽然它不同 - 第一个使用 ssh 而后者使用 http)

现在,这个东西可能会简化一些事情,但我觉得它可以更好。

我使用 Emacs(具体来说是 Spacemacs 发行版)。现在我想知道是否有人已经构建了与 集成的任何东西magit,或者我可以自己做吗?我的意思是这有多难?脚本应该让您提交然后推送分支,然后使用给定的默认值创建基于该分支针对“开发”的拉取请求。有没有人做过这样的事情?

你们能指点我一些elisp利用力量magit来做类似事情的插件吗?也许我可以自己写一些东西。

4

3 回答 3

5

我在 github 上找到了这篇关于从 emacs 创建 PR 的原始帖子。 http://endlessparentheses.com/easy-create-github-prs-from-magit.html

这不适用于 bitbucket(存储)。但这对我来说已经足够信息了,我能够拼凑出一个适合我的解决方案。

https://github.com/flamingbear/emacs-config/blob/master/site-lisp/lisp/mhs-magit.el

(defun endless/visit-pull-request-url ()
  "Visit the current branch's PR on Github."
  (interactive)
  (let ((repo (magit-get "remote" (magit-get-remote) "url")))
    (if (string-match "github\\.com" repo)
    (visit-gh-pull-request repo)
  (visit-bb-pull-request repo))))


(defun visit-gh-pull-request (repo)
  "Visit the current branch's PR on Github."
  (interactive)
  (browse-url
   (format "https://github.com/%s/pull/new/%s"
     (replace-regexp-in-string
      "\\`.+github\\.com:\\(.+\\)\\.git\\'" "\\1"
      repo)
     (cdr (magit-get-remote-branch)))))



;; Bitbucket pull requests are kinda funky, it seems to try to just do the
;; right thing, so there's no branches to include.
;; https://bitbucket.org/<username>/<project>/pull-request/new
(defun visit-bb-pull-request (repo)
  (browse-url
   (format "https://bitbucket.org/%s/pull-request/new"
           (replace-regexp-in-string
            "\\`.+bitbucket\\.org:\\(.+\\)\\.git\\'" "\\1"
            repo))))

;; visit PR for github or bitbucket repositories with "v"
(eval-after-load 'magit
  '(define-key magit-mode-map "v"
     #'endless/visit-pull-request-url))
于 2015-10-02T19:33:15.450 回答
3

魔术师锻造

magit 现在带有forge,用于处理问题/公关/等。在任何 git 锻造中。它支持开箱即用的github 、gitlab,部分支持 bitbucket、gitea、gitweb、cgit、gogs 等。

要创建新的拉取请求(或问题)(来自文档):

' p     (forge-create-pullreq)

C-c C-n[关于“拉取请求”部分] ( forge-create-pullreq)

此命令为当前存储库创建一个新的拉取请求。

' i     (forge-create-issue)

C-c C-n[关于“问题”部分] ( forge-create-pullreq)

此命令为当前存储库创建一个新问题。


老答案:

有一个 magit 扩展用于处理 github 拉取请求。您可以在此处浏览该项目

您还应该通过magit 项目的维护者阅读这篇文章。

所以我担心目前没有一个包可以满足你的需求。如果你想自己写,我建议你使用 request.el,然后只实现你真正需要的 Github api 部分,以避免过度设计它。

于 2015-10-02T17:40:32.333 回答
1

(magit-get "remote" (magit-get-remote) "url")退货为零的情况下,已得到改进。

(defun endless/visit-pull-request-url ()
  "Visit the current branch's PR on Github."
  (interactive)
  (let ((repo (magit-get "remote" (magit-get-remote) "url")))
    (if (not repo)
    (setq repo (magit-get "remote" (magit-get-push-remote) "url")))
    (if (string-match "github\\.com" repo)
    (visit-gh-pull-request repo)
      (visit-bb-pull-request repo))))

(defun visit-gh-pull-request (repo)
  "Visit the current branch's PR on Github."
  (interactive)
  (message repo)
  (browse-url
   (format "https://github.com/%s/pull/new/%s"
       (replace-regexp-in-string
        "\\`.+github\\.com:\\(.+\\)\\(\\.git\\)?\\'" "\\1"
        repo)
       (magit-get-current-branch))))

;; Bitbucket pull requests are kinda funky, it seems to try to just do the
;; right thing, so there's no branches to include.
;; https://bitbucket.org/<username>/<project>/pull-request/new
(defun visit-bb-pull-request (repo)
  (message repo)
  (browse-url
   (format "https://bitbucket.org/%s/pull-request/new?source=%s&t=1"
       (replace-regexp-in-string
        "\\`.+bitbucket\\.org:\\(.+\\)\\.git\\'" "\\1"
        repo)
       (magit-get-current-branch))))
;; visit PR for github or bitbucket repositories with "v"
(eval-after-load 'magit
  '(define-key magit-mode-map "v"
     #'endless/visit-pull-request-url))
于 2017-09-05T06:57:43.513 回答