Git创建子仓库命令submodule的使用

使用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

发布了44 篇原创文章 · 获赞 31 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u013463707/article/details/98758863