写了一个函数专门用于删除 submodule

Git submodule 用于追踪开源社区上游项目非常方便, 在Emacs中, 只用执行 magit-submodule-add 命令就可以非常方便的添加 submodule.

但是git却没有提供一键删除 submodule 的功能, 为了删除一个 submodule , 一般需要做下面的几步:

  1. 删除项目源码子目录
  2. 删除 .gitmodules 文件中 submodule 的信息
  3. 删除 .git/config 文件中 submodule 的信息
  4. 删除 .git/modules/ 目录下 sumodule 的子目录
  5. 应用修改

今天写了一个 magit-submodule-remove 函数自动做上面的工作: https://www.emacswiki.org/emacs/magit-extension.el

现在要尝试优秀的 Emacs 插件, 只用 magit-submodule-add 添加插件, 喜欢就保留, 不喜欢执行 magit-submodule-remove 删除之.

Enjoy, emacser!

7 个赞

很实用,希望能融合进magit,以便少装一个包。

https://github.com/magit/magit/pull/3582 我给 magit 发了一个 PR , 看看作者收不收吧, 收了以后就可以不用安装我的 magit-extension.el

3 个赞

这两天在给 magit 发送补丁: https://github.com/magit/magit/pull/3583

推动了 magit 的作者的两个功能: https://github.com/magit/magit/pull/3585

  1. magit-submodule-remove 会很快合并进 magit 的代码分支
  2. magit-submodule-add 默认使用异步操作, 意味着添加超大规模的 submodule 不会卡主 emacs.
3 个赞

顺便给大家推销一个牛逼的插件: https://github.com/vermiculus/magithub

随着 https://github.com/magit/magit/pull/3585 这个补丁的合并.

magit-submodule-remove 已经合并进 magit 主分支了, 大家更新magit以后就可以直接删除 submodule 了. magit 作者的这一版默认不删除 .git/modules 目录下的残留文件, 担心有用户的个人修改, 我个人经常只用 submodule 跟踪插件, 但不修改, 所以我在此基础上写了一个强制删除的版本:

(defun magit-submodule-remove+ ()
  (interactive)
  (magit-submodule-remove (list (magit-read-module-path "Remove module")) "--force" nil))

在推动 magit-submodule-remove 的时候, 同时也推动了 magit-submodule-add 的异步处理, 现在添加 submodule 不会卡主 emacs 了.

今天为止, 我的 magit-submodule-remove 代码已经完成了小小的历史使命, 正式退出舞台, 大家更新 magit 吧, 哈哈哈.

9 个赞

已经用上了,好用。

这个功能已经被 magit 作者合并到最新版本中,直接用 magit 里面的功能吧。

2 个赞

@manateelazycat 我使用magit-submodule-remove 的时候,必须切换到git根目录才可以,如果当前buffer不在git根目录,则显示不出来submodule。是不是无法向上查找.gitmodule 文件呢?

需要在根目录是 magit 自身的限制, 里面调用 git ls-files 的时候用了当前路径, 不在根目录下面就显示不出来 submodule 了. 不过从 magit-status 界面进去的话是没问题的, 因为会自动定位到根目录, 我感觉这也是大部分人的用法, 直接调用命令的情况应该比较少. 实在介意的话可以去 magit 提个 issue 看作者愿不愿意优化下.

向上查找 submodule 这方面, 我觉得 magit 里面不做也可以理解, 因为 git 的 submodule 是可以嵌套的, 向上递归有时候可能有歧义, 实现也比较复杂.

哦哦,我试了一下magit status,确实可以,谢了谢了。