克隆包含带有本地分支的子模块的本地Git存储库

时间:2015-11-14 00:15:14

标签: git git-submodules git-clone

我在我的本地git存储库中添加了一个子模块(用于嵌入式项目的GUI库。)我需要为我的硬件添加几个驱动程序文件并将它们添加到本地开发分支:这些更改不会被推回到远程。我的计划是偶尔从远程转移到master分支的更改,然后在这些更改之上重新设置我的dev分支。

当我尝试使用以下方法制作本地存储库的本地克隆时出现问题:

git clone --recursive local_repo local_clone

我得到了

fatal: reference is not a tree: ca025c09ca2b7b82ca086309eeb0696d674cb1d0
Unable to checkout 'ca025c09ca2b7b82ca086309eeb0696d674cb1d0' in submodule path 'uGFX/ugfx_submodule'

这个特定的提交在我的本地开发分支上(并且绝对不在子模块的远程服务器上。)

是否有一种简单的方法可以克隆本地存储库? (除了cp -r =)

2 个答案:

答案 0 :(得分:2)

冒着回答我自己问题的失礼的风险,我昨晚很晚才想出一个可行的解决方案......

我想要的是基于Triangular Workflow,我的要求是:

  1. 我需要从uGFX Bitbucket存储库的主分支获取代码,并且能够在可用时从该分支获取更改,并在测试后将它们集成到我的产品中
  2. 我需要能够将代码添加到uGFX树中,并将这些添加内容保存在源代码控制之下,但不要将它们推回到uGFX存储库(我的代码特定于我的项目和专有的h / w,相信我,他们不想要它。=)
  3. 其他用户必须能够克隆我的存储库。他们不必通过Bitbucket更改来更新uGFX树(我将在这些更改集成时进行处理),尽管如果他们对其存储库进行了少量修改,他们就可以。
  4. 我的解决方案涉及使用上游存储库as VonC mentioned的Triangular Workflow版本。以下是我的解决方案的细节:(您可能可以修改以满足您的需求)

    • 创建一个上游Git服务器。我使用了Raspberry Pi并将回购放置在USB记忆棒上,因为它很方便,从this article开始,虽然我从Git book做了一些额外的步骤,我添加了一个git用户,一些授权公众ssh键等......
    • 在Git服务器上创建两个裸存储库,本例中称之为myproduct.git和myproduct_ugfx.git
    • 将我的存储库的主分支推送到myproduct.git存储库。我没有写下这部分,但我想我刚刚为原点添加了一个遥控器并推动了主人:

      git remote add origin git@pi-b:/mnt/git_repos/myproduct.git git push

    • 从我的存储库的顶层目录添加uGFX子模块

      git submodule add https://bitbucket.org/Tectu/ugfx.git ugfx_submodule

    • 进入子模块的目录,并将子模块的主分支名称更改为更新

      git branch -m master updates

    • 将远程原点重命名为bitbucket,更新分支(以前称为master)跟踪

      git remote rename origin bitbucket

    • 此时,运行git branch -vv就像检查一样,它应该显示一个跟踪远程bitbucket主分支的分支(更新)

    • 现在您的子模块不再具有主分支或原点。我希望子模块主分支跟踪我的Pi Git服务器的存储库,所以我添加了一个远程源,创建一个主分支,并将主分支推送到服务器(告诉它跟踪该分支):

      git remote add origin git@pi-b:/mnt/git_repos/myproduct_ugfx.git git checkout -b master git push -u origin master

    • 既然我已经将子模块推送到我的服务器,我将uGFX子模块更改为指向我的服务器,所以当人们使用--recursive克隆整个repo时,他们会得到我的更新

      git config remote.origin.url git@pi-b:/mnt/git_repos/myproduct_ugfx.git

    此时,我想在uGFX树中添加一些文件。我将它们添加到主分支,提交,然后推送(进入Pi存储库。)还记得在子模块之外进行指导,运行' git子模块同步' (不确定是否必要),然后提交+将这些更改推送到主/外部仓库。

    现在,当Bitbucket存储库发生更改时,我可以将它们拉入更新分支,然后当我对它们进行测试并希望将它们集成到我的产品中时,我可以将它们与master合并并推送通过简单的git推送它们到Pi存储库。

    如果有人想要从Pi克隆myproduct存储库,只要他们可以访问Pi(参见Git book中添加ssh密钥),他们就可以使用

    git clone --recursive git@pi-b:/mnt/git_repos/myproduct.git

答案 1 :(得分:0)

  

这些更改不会被推回到远程

但是主要的回购仍然记录了子模块的准确状态。

克隆时,它将从子模块上游repo获取该状态...这将无法提供它,因为这些更改没有被推回到远程。

您可以考虑:

看看父回购的克隆是否有效。