git submodules:Unable to find current origin/master revision in submodule path

1.git submodules

使用场景基于公司的项目会越来越多,常常需要提取一个公共的类库提供给多个项目使用,但是这个library怎么和git在一起方便管理呢?

  • 我们需要解决下面几个问题:

如何在git项目中导入library库?library库在其他的项目中被修改了可以更新到远程的代码库中?
其他项目如何获取到library库最新的提交?
如何在clone的时候能够自动导入library库?
解决以上问题,可以考虑使用git的 submodule 来解决。

submodule是什么?

  • git submodule 是一个很好的多项目使用共同类库的工具,它允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commit,push,pull。
  • 父项目以Submodule的形式包含子项目,父项目可以指定子项目header,父项目中提交信息包含Submodule的信息,在clone父项目的时候可以把Submodule初始化

submodule使用eg如下:

(1)添加子模块,添加一个名为 “DbConnector” 的库。
$ git submodule add http://github.com/chaconinc/DbConnector

默认情况下,子模块会将子项目放到一个与仓库同名的目录中,本例中是 “DbConnector”。 
如果你想要放到其他地方,那么可以在命令结尾添加一个不同的路径。

在 git status 输出中,列出的另一个是项目文件夹记录
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitmodules
    new file:   DbConnector


首先应当注意到新的 .gitmodules 文件。 该置文件保存了项目 URL 与已经拉取的本地目录之间的映射
$ cat .gitmodules
[submodule "DbConnector"]
    path = DbConnector
    url = http://github.com/chaconinc/DbConnector

如果有多个子模块,该文件中就会有多条记录。 
要重点注意的是,该文件也像 .gitignore 文件一样受到(通过)版本控制。 它会和该项目的其他部分一同被拉取推送。 
这就是克隆该项目的人知道去哪获得子模块的原因。


虽然 DbConnector 是工作目录中的一个子目录,但 Git 还是会将它视作一个子模块。当你不在那个目录中时,Git 并不会跟踪它的内容, 而是将它看作该仓库中的一个特殊提交。
$ git diff --cached DbConnector
diff --git a/DbConnector b/DbConnector
new file mode 160000
index 0000000..c3f01dc
--- /dev/null
+++ b/DbConnector
@@ -0,0 +1 @@
+Subproject commit c3f01dc8862123d317dd46284b05b6892c7b29bc



(2)克隆含有子模块的项目
当你在克隆这样的项目时,默认会包含该子模块目录,但其中还没有任何文件:
$ git clone http://github.com/chaconinc/MainProject
Cloning into 'MainProject'...
$ cd MainProject
$ ls -la
total 16
drwxr-xr-x   9 schacon  staff  306 Sep 17 15:21 .
drwxr-xr-x   7 schacon  staff  238 Sep 17 15:21 ..
drwxr-xr-x  13 schacon  staff  442 Sep 17 15:21 .git
-rw-r--r--   1 schacon  staff   92 Sep 17 15:21 .gitmodules
drwxr-xr-x   2 schacon  staff   68 Sep 17 15:21 DbConnector
-rw-r--r--   1 schacon  staff  756 Sep 17 15:21 Makefile
drwxr-xr-x   3 schacon  staff  102 Sep 17 15:21 includes
drwxr-xr-x   4 schacon  staff  136 Sep 17 15:21 scripts
drwxr-xr-x   4 schacon  staff  136 Sep 17 15:21 src
$ cd DbConnector/
$ ls
$
其中有 DbConnector 目录,不过是空的


你必须运行两个命令:git submodule init 用来初始化本地配置文件,而 git submodule update 则从该项目中抓取所有数据并检出父项目中列出的合适的提交。
$ git submodule init
$ git submodule update
现在 DbConnector 子目录是处在和之前提交时相同的状态了。

如果给 git clone 命令传递 --recursive 选项,它就会自动初始化并更新仓库中的每一个子模块。
git clone --recursive http://github.com/chaconinc/MainProject

(3)删除Submodule
git 并不支持直接删除Submodule需要手动删除对应的文件:
cd pod-project
git rm --cached pod-library
rm -rf pod-library
rm .gitmodules

更改git的配置文件config,可以看到Submodule的配置信息:
vim .git/config

删除submodule相关的内容,然后提交到远程服务器:
git commit -a -m 'remove pod-library submodule'

2.问题及解决办法

(1)问题:

  • Unable to find current origin/master revision in submodule path
我决定为该库创建一个子模块
git submodule add https://github.com/mb21/JSONedit.git
git commit -am 'added JSNedit submodule'
git push -u origin master
git pull origin master

然后,我确实在本地文件夹中看到了JSONedit文件夹,并且在线上看到了git文件夹中的链接
但是当我执行git submodule update --remote JSONedit/时,出现以下错误:
fatal: Needed a single revision
Unable to find current origin/master revision in submodule path 'JSONedit'
  • 解决办法:
删除子模块所属的文件夹
rm -rf JSONedit
git submodule update

(2)问题:

  • No submodule mapping found in .gitmodules for path …
git rm --cached path
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢打篮球的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值