使用git submodule管理一个需要多个分立开发或者第三方repo的项目
在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方
开源repo的更新。另外一方面如果我们自己在开发一个网站的项目,这个项目一般分为前端和后端两个相对独立的子项目,特别是前端的repo可能在不同的项目中共享,那么这时,你就可能希望将项目分开为前端和后端两个repo,如何管理这种情况呢?一个比较好的方案就是使用git的submodule功能。
假设我们的父repo在prepo目录,sumodule newtestrepo希望放在prepo/submods/newtestrepo这个目录,首先我们cd submods目录,
1. 在submods目录下执行:git submodule add https://github.com/cnweibo/newtestrepo.git 这个命令将在prepo目录下创建.gitmodules文件以及在prepo/submods/目录下创建newtestrepo目录用于保存newtestrepo内容。.gitmodules文件包含以下内容:
[submodule "submods/newtestrepo"]
path = submods/newtestrepo
url = https://github.com/cnweibo/newtestrepo.git
注意:在1.8版本git之前,上述命令必须在preop的root目录下执行!
2.执行git status,则发现有两个变更需要commit
(newcnweibo_branch)*$ git status
On branch newcnweibo_branch
Your branch is up-to-date with 'origin/newcnweibo_branch'. Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: ../.gitmodules
new file: newtestrepo
3.执行git commit将增加submodule newtestrepo这个commit做一下提交
(newcnweibo_branch)*$ git commit -m "intro newtestrepo submodule"
[newcnweibo_branch 2bb87a3] intro newtestrepo submodule
files changed, insertions(+)
create mode .gitmodules
create mode submods/newtestrepo
4. git push 将上述修改放到preop的中央库中去以便其他teammember使用
5. 如何在prepo这个项目中修改submodule呢?git checkout master 进入newtestrepo的master branch, 修改文件,commit,随后git push,注意这里的push是将submodule push到中央库中。注意:submodule/newtestrepo目录下不再有.git目录,而只有一个.git文件,这一点很是奇妙!
在我们的submodule的目录中,你查看一下.git这个文件(不是文件夹哦!)的内容实际上指示列出来一个引用gitdir指向prepo的.git/modules/xxxdir/xxxrepo
(detached*)$ cat .git
gitdir: ../../.git/modules/submods/newtestrepo
6. 注意,这时如果我们到prepo的目录中,git status发现我们又有了两个没有commit的commit。
随后我们需要将prepo也做push以便将上述两个commits递交.
之所以在submodule中修改并且push后还要在prepo中push是因为我们的父repo其实是引用了子module的一个snapshot,子module修改后,父repo并没有修改对版本的引用,因此需要commit来反映这个变化。
7.当我们另外一个teammember clone这个prepo时,注意,prepo里面所包含的submodule本身目录都为空!
*$ pwd
/home/cabox/workspace/testgit
*$ git clone https://github.com/cnweibo/githubtest.git
Cloning into 'githubtest'...
remote: Counting objects: , done.
remote: Total (delta ), reused (delta ), pack-reused
Unpacking objects: % (/), done.
Checking connectivity... done.
*$ ls
githubtest
*$ cd githubtest/
(newcnweibo_branch)$ ls
localconfig newweibobranchfile readmegithub submods
(newcnweibo_branch)$ git status
On branch newcnweibo_branch
Your branch is up-to-date with 'origin/newcnweibo_branch'. nothing to commit, working directory clean
(newcnweibo_branch)$ cd submods/
(newcnweibo_branch)$ ls
newtestrepo
(newcnweibo_branch)$ cd newtestrepo/
(newcnweibo_branch)$ ls
(newcnweibo_branch)$ ls -la
total
drwxrwxr-x cabox cabox May : .
drwxrwxr-x cabox cabox May : ..
(newcnweibo_branch)$
但是我们的prepo: githubtest本身却有一个文件.gitmodules,它列出了在prepo中是如何引用sub module的
(newcnweibo_branch)$ pwd
/home/cabox/workspace/testgit/githubtest
(newcnweibo_branch)$ ls -la
total
drwxrwxr-x cabox cabox May : .
drwxrwxr-x cabox cabox May : ..
drwxrwxr-x cabox cabox May : .git
-rw-rw-r-- cabox cabox May : .gitmodules
-rw-rw-r-- cabox cabox May : localconfig
-rw-rw-r-- cabox cabox May : newweibobranchfile
-rw-rw-r-- cabox cabox May : readmegithub
drwxrwxr-x cabox cabox May : submods
(newcnweibo_branch)$ cat .gitmodules
[submodule "submods/newtestrepo"]
path = submods/newtestrepo
url = git@github.com:cnweibo/newtestrepo.git
8.为了能够正常使用submodule,我们必须在新clone的prepo中执行 git submodule init命令,执行该命令时:git将通过检查.gitmodules文件中的
[submodule "submods/newtestrepo"] 这个section,为每一个submodule都正在prepo的.git/config文件中增加一条
[submodule "submods/newtestrepo"]
url = git@github.com:cnweibo/newtestrepo.git 信息!
(newcnweibo_branch)$ pwd
/home/cabox/workspace/testgit/githubtest
(newcnweibo_branch)$ git submodule init
Submodule 'submods/newtestrepo' (git@github.com:cnweibo/newtestrepo.git) registered for path 'su
bmods/newtestrepo'
(newcnweibo_branch)$ ls -la
total
drwxrwxr-x cabox cabox May : .
drwxrwxr-x cabox cabox May : ..
drwxrwxr-x cabox cabox May : .git
-rw-rw-r-- cabox cabox May : .gitmodules
-rw-rw-r-- cabox cabox May : localconfig
-rw-rw-r-- cabox cabox May : newweibobranchfile
-rw-rw-r-- cabox cabox May : readmegithub
drwxrwxr-x cabox cabox May : submods
(newcnweibo_branch)$ cat .git/
HEAD config hooks/ info/ objects/ refs/
branches/ description index logs/ packed-refs
(newcnweibo_branch)$ cat .git/config
[core]
repositoryformatversion =
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = https://github.com/cnweibo/githubtest.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "newcnweibo_branch"]
remote = origin
merge = refs/heads/newcnweibo_branch
[submodule "submods/newtestrepo"]
url = git@github.com:cnweibo/newtestrepo.git
(newcnweibo_branch)$
9.随后我们在prepo再执行git submodule update,这时git将通过Internet把所有的submodule clone进入我们的子目录中(由.gitmodules文件来决定放到哪个子目录中)
(newcnweibo_branch)$ pwd
/home/cabox/workspace/testgit/githubtest
(newcnweibo_branch)$ ls -la submods/newtestrepo/
total
drwxrwxr-x cabox cabox May : .
drwxrwxr-x cabox cabox May : ..
(newcnweibo_branch)$ git submodule update
Cloning into 'submods/newtestrepo'...
Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository. Please make sure you have the correct access rights
and the repository exists.
Clone of 'git@github.com:cnweibo/newtestrepo.git' into submodule path 'submods/newtestrepo' failed
$ ssh -T git@github.com
Hi kidsit! You've successfully authenticated, but GitHub does not provide shell access.
$ exit
exit
(newcnweibo_branch)*$ pwd
/home/cabox/workspace/testgit/githubtest
(newcnweibo_branch)*$ git submodule update
Cloning into 'submods/newtestrepo'...
Warning: Permanently added the RSA host key for IP address '192.30.252.130' to the list of known hosts.
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), done.
Checking connectivity... done.
Submodule path 'submods/newtestrepo': checked out '6c495d0229fcd15fd7e0bb3cded878d0692988a5'
(newcnweibo_branch)$ git submodule update^C
(newcnweibo_branch)$ ls -la submods/newtestrepo/
.git README.md changefromprepo
(newcnweibo_branch)$ ls -la submods/newtestrepo/
.git README.md changefromprepo
(newcnweibo_branch)$ ls -la submods/newtestrepo/
total
drwxrwxr-x cabox cabox May : .
drwxrwxr-x cabox cabox May : ..
-rw-rw-r-- cabox cabox May : .git
-rw-rw-r-- cabox cabox May : README.md
-rw-rw-r-- cabox cabox May : changefromprepo
(newcnweibo_branch)$ cat submods/newtestrepo/.git
gitdir: ../../.git/modules/submods/newtestrepo
使用git submodule管理一个需要多个分立开发或者第三方repo的项目的更多相关文章
- [转]使用Git Submodule管理子模块
本文转自:https://blog.csdn.net/qq_37788558/article/details/78668345 实例代码: 父项目:https://github.com/jjz/pod ...
- 使用Git Submodule管理子模块
转自:https://segmentfault.com/a/1190000003076028 使用场景 基于公司的项目会越来越多,常常需要提取一个公共的类库提供给多个项目使用,但是这个library怎 ...
- git submodule 管理子项目
使用场景 拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用 git submodule 去完成. 常用命令 git clone <repo ...
- 转:Git Submodule管理项目子模块
使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...
- Git Submodule管理项目子模块
使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...
- git submodule的使用
1.在项目中使用Submodule 为当前工程添加submodule,命令如下:git submodule add 仓库地址 路径仓库地址:是指子模块仓库地址URL.路径:指将子模块放置在当前工程下的 ...
- Git 2.7: 一个新的带来许多新特性和性能提升的主要版本
在2.6版本发布两个月之后,Git 2.7发布.该版本带来了许多新特性以及性能的提升. 本文选取了Git 2.7带来的主要变化: git remote支持get-url子命令,可以显示指定远端的URL ...
- git submodule 使用小结
git submodule 使用小结 原文链接 http://blog.gezhiqiang.com/2017/03/08/git-submodule/###### Git Submodule 允许一 ...
- Git 分支管理策略汇总
原文链接: Git 分支管理策略 最近,团队新入职了一些小伙伴,在开发过程中,他们问我 Git 分支是如何管理的,以及应该怎么提交代码? 我大概说了一些规则,但仔细想来,好像也并没有形成一个清晰规范的 ...
随机推荐
- 【ASP.Net MVC】在AspNet Mvc使用JQuery AutoComplete组件
在AspNet Mvc使用JQuery AutoComplete组件 官方文档: http://api.jqueryui.com/autocomplete/#entry-examples 要使用JQu ...
- Hadoop的RPC框架介绍
为什么会引入RPC: RPC采用客户机/服务器模式.请求程序就是一个客户机,而服务提供程序就是一个服务器.当我们讨论HDFS的,通信可能发生在: Client-NameNode之间,其中NameNod ...
- HDU 3623 Best Cow Line, Gold(模拟,注意思路,简单)
题目 POJ 3617 和 这道题题目一样,只是范围稍稍再小一点. //模拟试试 #include<stdio.h> #include<string.h> #include&l ...
- Delphi的时间处理
这几天因为自己要学习编写一个小程序中要用到一些时间处理.就在网上搜集一些教材学习到一般的应用,做个笔记,加深印象. 用上Delphi中相应的函数,Delphi的时间处理起来还是很容易的. Delphi ...
- Shell script for logging cpu and memory usage of a Linux process
Shell script for logging cpu and memory usage of a Linux process http://www.unix.com/shell-programmi ...
- 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范
工程结构架构,减少耦合混乱以及防治需求大改造成结构重构,如何构建稳定可扩展可变换的工程结构的思考 我打算采用Information flow的方式自上而下,两大层分为基础层和展现层的结构.基础层分为多 ...
- MyEclipse 2015 CI
系统 win8.1 MyEclipse 2015 CI 激活后可用 激活工具 地址:http://download.csdn.net/detail/trep10000/8305577
- iis 重启 (三种方法)
iis 重启 (三种方法) WINDOWS提供WEB服务的IIS有时候会出现访问过大导致网站打不开,这时重启IIS是最好的选择. 方法/步骤 1 1.界面操作 打开“控制面板”->“管理工具”- ...
- C#DataGridView 美化
private void dataGridView(DataGridView dataGridView) { System.Windows.Forms.DataGridViewCellStyle da ...
- APM (应用性能管理)
在信息科学和系统控制领域,APM是用来监控和管理应用软件是否有效运行的.APM通过监测和分析应用的表现去保证软件应用的良好运行,APM已经商用. 基本定义 APM = Application Perf ...