GIT 的 SUBMODULE

作者: , 共 1278 字 , 共阅读 0

GIT 的一个很大的问题是没有权限划分,所有人对项目下所有东西都有(查看)权限(只能设置分支的推送权限),无法对特定文件和文件夹设置单独的权限。这个功能只能借用 SUBMODULE 来实现。

1、添加 SUBMODULE

git submodule add https://github.com/xxx/yyy sub/module

如果之前已经克隆了项目到指定位置,再执行git submodule add也是可以的,不会有冲突。添加后能在项目根目录下看到.gitmodules文件,里面内容为:

[submodule "sub/module"]
path = sub/module 
url = https://github.com/xxx/yyy 

如果添加过多个子项目,该文件里就会有多个条目。

还有一个变化是,.git/modules下面会添加项目的缓存。

2、删除 SUBMODULE

GIT 未提供submodule remove的功能。要删除一个子模块,需按照下面步骤操作:

  1. git submodule deinit sub/module,执行后模块目录将被清空。
  2. git rm sub/module,执行后会清除.gitmodules里的项目。
  3. git commit -m 'remove sub/module

第一步不做似乎也没关系。第二步是关键,这里不能直接rm sub/module,这样不会同步更新.gitmodules的内容。

3、克隆带 SUBMODULE 的项目

克隆母项目不会自动下载所包含的子项目,必须克隆之后再执行submodule init & update

git clone /path/to/repos/foo.git
git submodule init & update

如果子项目里还有子项目,可以用--recursive一次性搞定:

git submodule init & update --recursive

还有一个更简单的方法:

git clone --recursive /path/to/repos/foo.git

4、更新带 SUBMODULE 的项目

如果别人更新了母项目所指向的子项目的分支,此时单纯的拉取和合并母项目,并不会自动更新本地的子项目(通过 git status 能看到具体信息),必须执行submodule update

git pull origin master
git status
git submodule update

注意git submodule update也会覆盖本地对子项目指向的操作。因此需要注意当出现子项目new commits时,是因为其它人更改过还是自己对子项目更改过。

如果母项目添加了新的子模块,还需要像上面一样先init

git pull origin master
git status
git submodule init
git submodule update

Q. E. D.

类似文章:
编程 » GIT
git经常出现类似于HEAD detached at origin/development的错误提示。这是因为当前的 HEAD 没有位于任何一个分支上的缘故。
编程 » GIT
有时候不小心把一些大文件 commit 到了本地版本库,但往网络版本库同步时,因为文件过大被拒绝。如果在上传前,本地有多次提交,此时再在当前版本里删除这些大文件还不够,还需要把历史记录全删掉。效果要跟从来没提交过这些文件一样。
相似度: 0.193
IT » GIT, proxy
大部分设置都是通过git config命令实现的:
相似度: 0.152
编程 » pytorch, C++
目前 pytorch 已经升级到了 1.7.0 ,但在 ubuntu 20.04 下有一个非常诡异的 bug。为此,我们只能自己编译。
IT » Python, Ubuntu
主要是update-alternatives命令的使用。
编程 » Python
imp.load_source在动态载入 python 模块时非常有用,但需要注意其特性。
相似度: 0.079
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径:
五一去了野山坡百里峡景区。其峡谷的确独具一格。华为 GT 手表记录的路程 13 公里,爬升 500 米。但华为手表历来高估路程和爬升,实际路程估计约 10 公里。
其实moment.js 官方主页已经很详细和清晰了,这里做一下笔记加强记忆。