写了一段更新Submodule的脚本

现在用submodule管理package,但是submodule的更新有点太复杂,所以hack了一段脚本,解决了两个痛点:

  1. 网络状况不好,连接github的时候有时候会被reset,然后就要每个package重新跑一遍。
  2. 有些package的主线分支是master,有些是main。

https://gist.github.com/ruibinx/379b2d4fb8687ebf54142792204d343a

抛砖引玉,期待大家更好的方法。

3 个赞

为什么不要magit? 集成挺好用的

可以分享一下你的用法吗?我用magit add/remove submodule,但是update的时候经常会出现Couldn’t find remote ref refs/heads/master

我也只是很基本的用法,你说的问题是因为网络问题吗?如果是的话这真不好解决 :thinking: 我倒没遇到过这错误

不完全是网络问题。我理解上边出错的原因是:git没有存submodule track的branch信息,只存了commit-id,有些项目主分支是main,有些是master,所以批量跑的时候直接pull master也不行

我 Makefile 里面有三个命令更新 submodule,感觉不需要什么脚本吧


# 更新到 remote 最新 commit
update:
	git submodule update --init --recursive --remote

# 初始化下载,更新到 .gitmodules 中指定的 commit
init:
	git submodule update --init

# 修改 .gitmodules 后
sync:
	git submodule sync

我执行update的时候,有些package执行不太正常,例如:

Unable to find current origin/master revision in submodule path ‘packages/marginalia’

也没找到特别好的方法解决。另外还会把submodule的submodule也update,导致submodule的状态变为dirty

用 straight 会不会更好, 还顺便解决了依赖的问题.

找时间试一试

borg 也是 submodule 管理。我的使用场景是经常在两台机器之间手动同步配置及 package,直接把配置也作为一个 package,这样 init.el就是一个模板,基本不会变。

看报措是 remote 那里找不到 master 分支了,应该是被 rename 了?如果是,你 cd 进去,手动切一下分支,pull 下应该就好了,后面也不会再有。

把 update 命令中的 --recursive 去掉即可。

现在 git 仓库有的是 master 作为主分支,有的是 main 作为主分支。有没有 git 命令,可以自动切换所有字模块的当前分支为 master 或者 main

我之前是使用

git submodule foreach git checkout master

但是遇到是 main 的仓库就没法执行了。

我记得oh-my-zsh里面有函数可以用, 大概类似于

git_current_branch () {
	local ref
	ref=$(command git symbolic-ref --quiet HEAD 2> /dev/null) 
	local ret=$? 
	if [[ $ret != 0 ]]
	then
		[[ $ret == 128 ]] && return
		ref=$(command git rev-parse --short HEAD 2> /dev/null)  || return
	fi
	echo ${ref#refs/heads/}
}

git submodule foreach git checkout $(git_current_branch) 

git submodule update --remote --jobs $(nproc) 好像也可以,但是发生错误容易中断。

多谢,回头试试看。

我换成straight.el了,确实更好用

我目前使用 Borg,总体来说还可以。就是 magit 比较慢。

不过用了 submodule 管理以后,也没那么积极去更新了 :grinning_face_with_smiling_eyes:。之前用 package.el 的时候天天滚,不滚不舒服。

简单粗暴的做法,再试一次 main 分支 :joy:

优雅点就先看下远程有哪个分支,再切过去。

再尝试 main 分支,会卡在 master 分支,一样不过去。

还好我的也就几个包是 main 分支的。就像你说的第二种方向手动切了,以后也就不动了。

原来全世界都是 master 分支作为主分支,非要搞个 main 分支作为主分支,真是闲的。