美文网首页
(原创)如何在gitolite下配置submodule

(原创)如何在gitolite下配置submodule

作者: mona_alwyn | 来源:发表于2017-08-14 18:28 被阅读0次

前言

现在很多公司、个人都在使用git来实行代码管理,而submodule也是一个比较好用的功能,可以在项目的代码仓库中创建一个子模块的仓库,这样子模块的每次commit并不会影响整个项目的版本更替,当子模块的功能完成后再对整个子模块add/commit即可。
在git下如何创建submodule,网上随便搜一搜都有,命令如下:

git submodule add <same url as if you were just cloning> <some path>
git submodule update --init --recursive

因为一半情况下,本地本地创建repo,然后push,就可以有url进行添加配置。

但是如果采用gitolite进行git repo的管理,就出现问题了。

初识gitolite

首先,使用gitolite管理repo的一个特点就是:只有管理员能创建repo。
所以不能在本地通过git init、git add、git commit、 git push这一套流程来创建repo。
其次,gitolite是通过配置文件来创建repo的。如下:

1.png 2.png

图1是repo的配置文件,图2是配置的命令
如图完成服务端配置并commit修改之后,就有了test、subtest、sub1三个repo。

配置操作

假设我们的需求是将subtest、sub1两个repo添加成为test的submodule。假设repo的url前缀为sample.com,接着上面的操作进行处理。

1. "实例化"repo

cd test
git status

得到如图3

3.png

这时候需要进行一次commit,比如

touch 1
git add 1
git commit -1 'xx'
git push origin master
git status

然后可得到图4

4.png

对着subtest进行相应的操作(提交一次commit)

2. 配置submodule

在完成上述的操作之后,就可以正常进行submodule的add操作了

cd test
git submodule add git@sample.com:subtest subtest
git add ./
git commit -m 'add submodule subtest'
git push origin master

这样就ok了,在其他地方执行以下命令即可

git clone git@sample.com:test
git submodule init
git submodule update

得到本地仓库如图5/6

5.png 6.png

tips

  • 1 不先进行repo "实例化"操作会怎样?
    sub1是没有进行“实例化”操作的,对sub1进行submodule配置操作的话,结果如图7
7.png

而如图5所示,本地已有sub1的文件夹,却并不能成功添加,这发生了什么呢?

个人猜测:
通过修改配置脚本创建repo,就相当于类的声明,就是在概念上它存在,但并没有实体,无法被trace;所以需要实例化,而trace的依据就是commit id。

  • 2 git sumodule init和git submodule update都做了什么?
    在实现的时候,由于管理员和我对repo地址的映射不一致,所以在执行上述两条命令的时候,出现过问题,如图8
8.png

管理员将repo的地址git@sample.com映射为git了,而我也针对git@sample.com单独配置了私钥映射为gitabc,这样对于git我就没有不能正确解析为git@sample.com,也有没有访问权限了。
然而此时我已经执行过上面两条命令了,怎么拯救呢?
首先要修改图5中的.gitmodules文件,如图9

9.png

然后要修改test/.git/config文件,如图10

10.png

然后删除subtest,再执行上面两条命令就可以了,如图11,别忘了提交改动

11.png

所以对于上述两条命令所做的工作,
个人猜测

  • git submodule add [url] [name]
    将子repo的git信息添加到.gitmodules文件中
  • git submodule init
    根据.gitmodules将子repo添加到父repo的.git/config中
  • git submodule update
    根据.git/config获取子repo的最新代码

以上纯属自己瞎猜,欢迎各位拍砖交流

相关文章

网友评论

      本文标题:(原创)如何在gitolite下配置submodule

      本文链接:https://www.haomeiwen.com/subject/ejgurxtx.html