如何使用现有存储库添加/更新子模块以节省带宽?

时间:2014-11-10 00:02:53

标签: git git-submodules

说我有一些大的回购,BigRepo,我想将它添加为另一个项目的子模块。通常我会做

$ git submodule add git@somewhere.com/me/BigRepo.git

但我不想再次下载整件事了。幸运的是我已经结账了,所以我试试

$ git clone ../BigRepo
Cloning into 'BigRepo'...
done.
$ git submodule add git@somewhere.com/me/BigRepo.git
Adding existing repo at 'BigRepo' to the index

大!除

  1. 子模块中的origin遥控器指向../BigRepo;我希望它指向git@somewhere.com/...
  2. .git文件夹位于BigRepo/.git而不是.git/modules/BigRepo
  3. 那么正确的做法是什么?

1 个答案:

答案 0 :(得分:1)

要做一些修复工作,因为你想要丢弃该代理仓库的所有证据(../BigRepo),但这并不难。

从这里最简单的可能就是重做子模块添加你拥有的东西,通过

来做
# undo the in-repo add
mv BigRepo ../agggh_I_meant_to_add_this_from_outside
git rm --cached BigRepo
git config -f .gitmodules --remove-section submodule.BigRepo
git config                --remove-section submodule.BigRepo

你的退出已经完成了。

现在,如果您从本地未发布的仓库添加子模块,则必须稍后更正其他网址以方便其他人,但这很简单:

# Get `git submodule add` to do the hoisting for you
git submodule add ../agggh_* BigRepo

# but from now on use u://r/l as the submodule's published repo:
git config -f .gitmodules --set submodule.BigRepo.url u://r/l
git config                --set submodule.BigRepo.url u://r/l  # alternate spelling of `git submodule sync BigRepo` here

# and the published repo is my copy's `origin` too
git --git-dir=BigRepo/.git remote set-url origin u://r/l

在评论中编辑寻址问题:

mv /克隆到mv'd一对是因为你可能已经完成,或已经完成并忘记了一些工作,因此../BigRepo可能会超出过期。这只是一个安全游戏; rm -rf BigRepo以及之后的git submodule add ../BigRepo如果当前添加的版本真的可以丢弃,也会有效。

我无法确定上面添加的任何子模块如何引发网络活动 - ../anything../ThisRepo位于同一文件系统,即.,对吧? git clone一个简单的相同文件系统路径,相对或绝对,除了你采取措施激发实际副本之外,它会使用廉价的硬链接 - 这甚至可以在NTFS上运行。仅当您指定完整URL或以其他方式强制git创建完整副本克隆的问题时。也许只是咖啡因异常缓慢地踢,如果我遗失了一些东西,无论谁看到它,只需编辑它或编辑整个段落。