git 创建子仓库 submodule

原文:https://blog.csdn.net/u013463707/article/details/98758863

使用Git submodule步骤:

一、先clone 一个父仓库:git clone "ssh://1632@ip:29418/test"

cd test

git submodule add <submodule_url>
例如:git submodule add ssh://username@ip/[path]/xxx.git

根据https://www.cnblogs.com/ibingshan/p/10238469.html中说明,不带username@可以多人使用,会根据系统配置获取用户名。

但我试了不行,但我们一般都没有开通匿名访问或HTTP访问,或者HTTP访问需要输入用户名和密码较麻烦。又不能将username写死,这样没有办法多人各自使用自己账号共用。

那有没有好的办法呢?那就把username使用指令来获取当前系统配置的git用户,这就要求用户取代码前需先配置git 账户。

(1)先使用 git submodule add "ssh://1632@ip:29418/test/test1"

此时会在test 目录下新增一个.gitmodules文件

(2)vi .gitmodules  修改其中1632为 `git config user.name`         --之所以不在第一步就替换1632是因为那个时候就会把git config user.name解析为1632,上传前还需要修改,没有意义。其中  ··为TAB上面那个反单引号按键

   (3)git add .gitmodules 

    git commit -m "add submodule"

    git push

(2)vi .gitmodules  将url 后的地址改为相对路径,例如:原来是ssh://1632@ip:29418/test/test1,修改为./test1

(3)git add .gitmodules 

    git commit -m "add submodule"

    git push

然后下次取得时候就会自动使用取父仓库的用户名了

感谢:https://stackoverflow.com/questions/7714326/git-submodule-url-not-including-username

二、取一个带有submodule的仓库

git clone "ssh://1632@ip:29418/test"

此时看到有test1目录,但里面是空的

git submodule                                               可以看到submodule信息前有个减号'-'
 
git submodule init                                      第一次不带参数克隆需要初始化
 
git submodule update                                 这样就会把submodule的内容clone下来
 
git submodule foreach git checkout master               注意:update 后的 submodule 会被 checkout 到 head 的 commit id 上,并不会自动checkout 到 master 分支,所以这行是在所有的 submodule 中 checkout master
方式二
 
git clone ssh://ip/[path]/topRepository.git --recursive    这种方式会在克隆父仓库的同时克隆submodule
 
cd topRepository                                                          进入父仓库
 
git submodule                                          可以看到submodule信息前没有减号'-'
 
git submodule foreach git checkout master                  注意:update 后的 submodule 会被 checkout 到 head 的 commit id 上,并不会自动checkout 到 master 分支,所以这行是在所有的 submodule 中 checkout master
 
如果 submodule 中还带有 submodule,那么可以是用 --recursive 参数
git submodule  使用的是commitID,不是branch,所以每次需要先将submodule代码checkout到master,再修改提交

另外除了提交submodule内的代码,还需要更新父仓库变化,父仓库也会显示子仓库有改动,父仓库add ,push后并不是将这个目录提交上git,只是更新了关联的submodule 的commitID。这一点比较麻烦

三、删除一个子module

rm .gitmodule   或删除.gitmodule中一个或几个module的信息

git rm --cached submodule_name  例:git rm --cached test1

git add .

git commit -m "test"

git push

 

参考:https://www.cnblogs.com/ibingshan/p/10238469.html

 

另外还有git subtree与git submodule 的对比,参考;https://blog.csdn.net/liusf1993/article/details/72765131
————————————————
版权声明:本文为CSDN博主「lvjiong353」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013463707/article/details/98758863

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值