目前工作接触到了git 由于之前使用的是svn版本管理,虽然两者有些相似但是完全不能混为一谈。所以我决定好好看看。
首先让我们了解一下为什么需要git submodules这种处理方式,如果要对外部依赖项进行严格的版本管理,则可以使用git子模块。以下是git子模块的最佳用例:
(1)当外部组件或子项目的更改速度太快或将发生的更改将破坏API;
(2)更新频率不高但希望将其作为供应商依赖性进行跟踪;
(3)将项目的一部分委派给第三方,想在特定的时间或发布时集成他们的工作。
今天遇到了一个问题,就是当你的git 资料库(repository,后面简称repo)用到另一个git repo的时候该注意什么。
因为我刚接触git版本控制开发的项目,在git clone url下载代码的时候发现,它还会clone 另一个url 并且提示输入密码。。。我就懵了,因为我已经生成过ssh密钥,而且在git lab上添加过ssh 公钥了,怎么还会出现提示输入密码的情况?
后来发现sub modules指定url是另一台gitlab服务器,我没有在那台服务器上面添加ssh public key(其实是同事发现的。怪我没有脑子。。。。)后来我将两台服务器用了同一个public key就可以clone成功了。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
一个特别好的git英文教程:
https://www.atlassian.com/git/tutorials
git submodules:
https://www.atlassian.com/git/tutorials/git-submodule#:~:text=A%20git%20submodule%20is%20a%20record%20within%20a,automatically%20updated%20when%20the%20host%20repository%20is%20updated.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
举例:建立一个空的repo并且添加一个submodules
mkdir git-submodule-demo && cd git-submodule-demo
git init #initialize a new repo
git submodule add https://1.1.10.1/shanzi.git #add submodule to new repo.the git submodule add command takes a URL parameter that points to a git repo
通过这个命令系统会立刻clone 这个submodule,并且我们可以看到多了shanzi.git下的文件,和一个.gitsubmodules (保存的是submodule 的地址映射)
[submodule "XXX"]
path = XXX
url = URL
当我们使用git clone 一个带有submodule是 repo的时候我们会发下clone结束以后原本引入submodule 的文件夹是空的,此时我们可以在该文件夹下使用
git submodule init #把.gitmodules file中的记录更新本地 .git/config中
git submodule update #从submodule 项目fetch所有数据并且在父项目中checkout mapped commit
可以使用--recursive 选项来告诉git clone也要 init 和 update 所有的submodules
git clone --recursive URL
缺点:可能init 多余的submodule
我们可以使用一个扩展的命令来init 我们需要的submodules
git submodule int ”module name“ #module name就是我们的”XXX"
子模块在初始化和和更新后就可以像独立存储库一样使用他们。因为子模块拥有自己的分支个历史记录。对子模块进行更改时,重要的是发布子模块更改,然后更新对子模块的父存储哭的引用。
注意始终提交和推送子模块和父存储库。