是否有可能在git中将子模块定义为相对路径为裸?

时间:2012-02-07 02:51:57

标签: git git-submodules

我得到了这个场景:

  1. 我创建了一个Git存储库。

    $ git init

  2. 克隆子目录中的外部存储库。 (在我的例子中使用git-hg)

    $ git hg clone lib remote_uri

  3. 将克隆的库添加为子模块

    $ git submodule add lib ./lib

  4. 然后我提交了更改

    $ git commit -am“添加了lib”

  5. 在此过程之后,如果我git clone这个回购和git submodule init/update新回购,我会得到回购和lib。

    无论如何,如果我试图将repo推到一个裸机,并从裸机克隆到另一个地方,新的崩溃尝试获取lib。 我试图在裸露的git submodule init,但如果你没有工作副本,命令就不起作用。

    有人知道可以做些什么吗?

    **更新** 这是一个没有hg的例子。

    This is a way to reproduce it.
    /tmp$ git clone https://github.com/gitster/git.git
    /tmp$ cd git/
    /tmp/git [master]$ git clone https://github.com/gitster/git.git gitrepo
    /tmp/git [master]$ git submodule add ./gitrepo
    /tmp/git [master]$ git commit -am "added repo"
    /tmp$ cd ..
    /tmp$ git clone --bare git  gitbare
    /tmp$ git clone  gitbare gittest
    /tmp$ cd gittest/
    /tmp/gittest [master]$ git submodule init
    Submodule 'gitrepo' (/tmp/gitbare/gitrepo) registered for path 'gitrepo'
    /tmp/gittest [master]$ git submodule update
    fatal: repository '/tmp/gitbare/gitrepo' does not exist
    Clone of '/tmp/gitbare/gitrepo' into submodule path 'gitrepo' failed
    

2 个答案:

答案 0 :(得分:0)

将子模块的URL设置为指向子模块存储的位置。之后不要调用submodule init,因为它会将它重置为没有子模块的地方。

答案 1 :(得分:0)

你好像在期待不可能的事。子模块本身就是存储库,为了能够从任何地方克隆它们,必须有一个可访问的存储库,就像父存储库一样。您添加了一个没有公共URL配置的子模块。 Git无法从你原始存储库中的版本中神奇地获取它。

您需要将子模块的URL更新为可以从您想要克隆它的任何位置访问的内容。您应该以与父存储库相同的方式托管它,无论是在单个计算机上,在单个网络上还是在GitHub上。

顺便说一句,您的复制说明与您的实际使用情况不同。在您发布的玩具箱中,您所要做的就是使用公共URL正确添加子模块:

git submodule add https://github.com/gitster/git.git gitrepo

一切都会好起来的。如果您以类似的方式托管您尝试添加为子模块的东西,那么此命令的相应版本将适合您。