git 子模块_Git子模块的问题

使用子模块并非没有任何缺点。首先,你在子模块目录中工作时必须相对小心。当你运行git submodule update,它会检出项目的指定版本,但是不在分支内。这叫做获得一个分离的头——这意味着 HEAD 文件直接指向一次提交,而不是一个符号引用。问题在于你通常并不想在一个分离的头的环境下工作,因为太容易丢失变更了。如果你先执行了一次submodule update,然后在那个子模块目录里不创建分支就进行提交,然后再次从上层项目里运行git submodule update同时不进行提交,Git会毫无提示地覆盖你的变更。技术上讲你不会丢失工作,但是你将失去指向它的分支,因此会很难取到。

为了避免这个问题,当你在子模块目录里工作时应使用git checkout -b work创建一个分支。当你再次在子模块里更新的时候,它仍然会覆盖你的工作,但是至少你拥有一个可以回溯的指针。

切换带有子模块的分支同样也很有技巧。如果你创建一个新的分支,增加了一个子模块,然后切换回不带该子模块的分支,你仍然会拥有一个未被追踪的子模块的目录

$ git checkout -b rackSwitched to a new branch "rack"
$ git submodule add git@github.com:schacon/rack.git rackInitialized empty Git repository in /opt/myproj/rack/.git/...Receiving objects: 100% (3184/3184), 677.42 KiB | 34 KiB/s, done.Resolving deltas: 100% (1952/1952), done.
$ git commit -am 'added rack submodule'[rack cc49a69] added rack submodule2 files changed, 4 insertions(+), 0 deletions(-)
create mode 100644 .gitmodules
create mode 160000 rack
$ git checkout masterSwitched to branch "master"
$ git status# On branch master# Untracked files:# (use "git add ..." to include in what will be committed)## rack/

你将不得不将它移走或者删除,这样的话当你切换回去的时候必须重新克隆它——你可能会丢失你未推送的本地的变更或分支。

最后一个需要引起注意的是关于从子目录切换到子模块的。如果你已经跟踪了你项目中的一些文件但是想把它们移到子模块去,你必须非常小心,否则Git会生你的气。假设你的项目中有一个子目录里放了 rack 的文件,然后你想将它转换为子模块。如果你删除子目录然后运行submodule add,Git会向你大吼:

$ rm -Rf rack/
$ git submodule add git@github.com:schacon/rack.git rack'rack' already exists in the index

你必须先将rack目录撤回。然后你才能加入子模块:

$ git rm -r rack
$ git submodule add git@github.com:schacon/rack.git rackInitialized empty Git repository in /opt/testsub/rack/.git/
remote: Counting objects: 3184, done.
remote: Compressing objects: 100% (1465/1465), done.
remote: Total 3184 (delta 1952), reused 2770 (delta 1675)Receiving objects: 100% (3184/3184), 677.42 KiB | 88 KiB/s, done.Resolving deltas: 100% (1952/1952), done.

现在假设你在一个分支里那样做了。如果你尝试切换回一个仍然在目录里保留那些文件而不是子模块的分支时——你会得到下面的错误:

$ git checkout master
error: Untracked working tree file 'rack/AUTHORS' would be overwritten by merge.

你必须先移除rack子模块的目录才能切换到不包含它的分支:

$ mv rack /tmp/
$ git checkout masterSwitched to branch "master"
$ ls
README rack

然后,当你切换回来,你会得到一个空的rack目录。你可以运行git submodule update重新克隆,也可以将/tmp/rack目录重新移回空目录。

!爆享折扣!

▼▼▼ 原价129 今日拼团仅需 ¥99 人专享首单限时优惠 ¥19.9!!! 但! 仅限前100个名额 ???

4ff9bf663376f0468f3bc96ea1588d42.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值