为什么`git submodule`每次都需要从远程存储库中获取?

时间:2011-10-19 02:48:40

标签: git git-submodules

仅从SO上的“git submodule”的结果数量来判断,这显然是一个常见且容易混淆的话题,所以我会尽量保持精确。

忘记关于更新/提交/分支子模块的所有(我理解这些事情使事情变得非常复杂),为什么每次更改分支时子模块都会被清空?根据我目前的理解,这使分支机构变得昂贵;如果我在机场,不能轻易/廉价地连接怎么办?我做错了什么,或者有一些我还没有意识到的发展理念?

示例永远不会受到伤害:

## make a new project
$> git --version
git version 1.7.5.4
$> mkdir new_proj; cd new_proj; git init
$> touch new_file_1.txt; touch new_file_2.txt
$> git add . && git commit -m "first commit"

## move into some development branch
$> git checkout -b cool_feature
$> <hack hack hack>
# in the middle, I add a submodule
$> git submodule add https://github.com/some/other_proj.git other_proj
$> git submodule update --init
$> ls -lR
new_file_1.txt
new_file_2.txt
other_proj
other_proj/that_file
other_proj/another_file

## I have to go back to master to do some work
$> git checkout master
# Why is other_proj still around?
$> git status
Untracked: other_proj
## Fine, I'll remove it, since I want a clean working copy, because I need to do some work and commits
$> git clean -f -d
$> <work work work>

## Now I'm ready to go back to cool_feature, but my submodules are empty!
$> git checkout cool_feature

此时,我应该git submodule update,但是如果我不能/它很昂贵(例如它很遥远,我没有互联网接入/它很慢)。

我提出的最好的解决方法是将我关心的所有子模块克隆到一个完全独立的位置,然后从我的本地克隆中复制子模块;这保留了子模块的廉价。当然,当你在团队中工作时,这会增加另一层复杂性。 :/

1 个答案:

答案 0 :(得分:2)

考虑到子模块只不过是pointer to a commit of another repogit submodule update有点不可避免(为了取回与所述指针关联的内容)。

另一种解决方法是克隆主要仓库:

  • 一个用于cool_feature分支,您有子模块
  • 一个用于主分支,其中没有任何子模块

从一个分支切换到另一个分支不需要git checkout(及其关联的git submodule update),而是需要更改路径。

另一种解决方法,如果您想在一个目录中工作,已在“Replaced third party code with git submodules, now I can't switch branches”中进行了描述

  

在切换到master分支

之前移动子模块目录