14

我需要使用几个不同的 git 存储库。如何使用 magit 在它们之间切换?Magit 允许我在启动它时选择一个目录。但我不清楚如果需要如何切换到另一个 repo。我查看了 magit 备忘单和文档,但没有找到答案。谢谢。

4

5 回答 5

19

您可以magit-status使用 prefix-arg ( C-u) 调用,它会提示您输入 git 存储库。因此,如果你为magit-statusis绑定键C-xg,你可以这样做C-uC-xg,它会提示输入 git repo。

您还可以将变量设置magit-repo-dirs为目录(C-hfmagit-repo-dirsRET了解更多信息),它会提示您在magit-repo-dirs.

如果您使用 projectile,您可以使用它记住您的项目目录并使用它填充的事实magit-repo-dirs,我在我的 init 文件中有这个来实现这一点

(eval-after-load "projectile" 
  '(progn (setq magit-repo-dirs (mapcar (lambda (dir)
                                         (substring dir 0 -1))
                                       (remove-if-not (lambda (project)
                                                        (file-directory-p (concat project "/.git/"))) 
                                                      (projectile-relevant-known-projects))))

         (setq magit-repo-dirs-depth 1)))

上面的代码在projectile加载后执行。projectile它通过do获取已知的项目列表(projectile-relevant-known-projects),遍历它们并将具有.git/文件夹的项目添加到magit-repo-dirs,它也设置magit-repo-dirs-depth为 1,因此 magit 仅在顶级目录中查找 git repos。

于 2014-02-21T10:58:06.137 回答
6

我发现如果你使用弹丸,最简单的就是设置以下内容:

(setq projectile-switch-project-action 'projectile-vc)

现在您可以使用C-p p s( projectile-switch-project) ,然后它会立即调用projectile-vc,如果您已magit安装,则只需magit-status在项目根目录中调用。简单的!

于 2014-08-22T22:00:45.070 回答
3

John Wiegley 有一个很好的包,叫做“Springboard”,它可能对你有用。

https://github.com/jwiegley/springboard

它取决于helmand/or ido,它允许您根据可能位于与当前活动缓冲区中的任何文件不同的目录中的文件执行任意命令。以非冗长的方式说明它有点困难(自述文件很好地解释了它),但只是以您的问题为例:

  • 假设您正在处理一个1.el属于 git repo 的文件,但您想运行magit-status一个单独的文件2.el,该文件完全位于另一个 repo 中。

  • 使用M-x springboardforhelmido-switch-bufferforido
    为您提供候选文件列表。

  • 通过关注2.el(但不选择它),您可以调用
    任意命令,就好像您在该文件的目录中工作一样。

  • 因此,如果您要专注于2.el然后magit-status从候选列表中调用,您将获得magit-status与文件关联的 repo 的正常窗口,2.el然后一旦完成处理,您就可以退出 magit1.el 并将成为活动缓冲区和一切都会像以前一样springboard被调用。

它非常有用。

于 2014-02-22T19:03:14.260 回答
1

执行 magit-status 时,Magit 使用当前缓冲区的当前工作目录。如果其他答案失败,这是低效但始终有效的替代方案:

  1. 关闭 magit 当前缓冲区(如果有) ( q)
  2. 将目录更改为包含您的 repo ( M-x cd)的目录
  3. 再次启动 magit ( M-x magit-status)

(效率低,因为 magit 会重启)

于 2020-02-14T13:48:51.237 回答
0

更新已接受的答案,这是在 Emacs 25remove-if-not中为我工作的代码。由于某种原因,它不是一个已知的函数。

(eval-after-load "projectile" 
'(progn (setq magit-repo-dirs (mapcar (lambda (dir)
(substring dir 0 -1))
(seq-remove (lambda (project)
          (not (file-directory-p (concat project "/.git/"))))
        (projectile-relevant-known-projects))))
(setq magit-repo-dirs-depth 1)))
于 2020-11-15T18:57:35.197 回答