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
的功能。要删除一个子模块,需按照下面步骤操作:
git submodule deinit sub/module
,执行后模块目录将被清空。git rm sub/module
,执行后会清除.gitmodules
里的项目。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.