Git 的 SUBMODULE

作者: , 共 1339 字

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 mv命令即可:

git mv dir1/sub1 dir2/sub2

3、删除 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的内容。

4、克隆带 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

5、更新带 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.

类似文章:
IT » GIT
分为三步。最简单的:
编程 » GIT
有时候不小心把一些大文件 commit 到了本地版本库,但往网络版本库同步时,因为文件过大被拒绝。如果在上传前,本地有多次提交,此时再在当前版本里删除这些大文件还不够,还需要把历史记录全删掉。效果要跟从来没提交过这些文件一样。
编程 » GIT
git经常出现类似于HEAD detached at origin/development的错误提示。这是因为当前的 HEAD 没有位于任何一个分支上的缘故。
相似度: 0.155
IT » GIT, proxy
大部分设置都是通过git config命令实现的:
相似度: 0.149
编程 » pytorch, C++
目前 pytorch 已经升级到了 1.7.0 ,但在 ubuntu 20.04 下有一个非常诡异的 bug。为此,我们只能自己编译。
IT » git
分支是一条线,随着开发进度一直往前推进,可以分叉、合并等。
IT » git
如果还没有执行git add,此时被认为尚未暂存以备提交的变更,git status结果如下:
IT » Python, Ubuntu
主要是update-alternatives命令的使用。
编程 » Python
imp.load_source在动态载入 python 模块时非常有用,但需要注意其特性。
命令行参数的初步说明,请参考argparse 模块用法实例详解,写的很清晰而详细。
五一去了野山坡百里峡景区。其峡谷的确独具一格。华为 GT 手表记录的路程 13 公里,爬升 500 米。但华为手表历来高估路程和爬升,实际路程估计约 10 公里。
其实moment.js 官方主页已经很详细和清晰了,这里做一下笔记加强记忆。