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

Cloning local Git repository containing a submodule with local branch

我在本地 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 = 除外)

these changes are not pushed back to the remote

但是主仓库仍然记录了子模块的确切状态。

克隆时,它将从子模块上游存储库中获取该状态...将无法提供它,因为这些更改未被推回远程。

你可以考虑:

  • changing the upstream repo of those submodules 到本地上游仓库。
  • 将这些更改推送到新的上游存储库

并查看父存储库的克隆是否正常运行。

冒着失礼的风险,我昨晚很晚才想出了一个可行的解决方案……

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

  1. 我需要从 uGFX Bitbucket 存储库的主分支获取代码,并能够在可用时从该分支提取更改,并在测试后将它们集成到我的产品中
  2. 我需要能够将代码添加到 uGFX 树并将这些添加内容保持在源代码控制之下,但不能将它们推回 uGFX 存储库(我的代码特定于我的项目和专有 h/w,相信我,他们不想要它。=)
  3. 其他用户必须能够克隆我的存储库。他们不必能够使用 Bitbucket 更改来更新 uGFX 树(当这些更改被集成时我会处理),尽管如果他们对他们的存储库进行小的修改他们可以。

我的解决方案涉及三角工作流的一个版本,使用上游存储库 。以下是我的解决方案的具体细节:(您可以对其进行修改以满足您的需要)

  • 创建上游 Git 服务器。我使用 Raspberry Pi 并将存储库放在 USB 记忆棒上,因为它很方便,从 this article, although I did some extra steps from the Git book 开始,我添加了一个 git 用户,一些授权的 public ssh 密钥,等...
  • 在 Git 服务器上创建两个裸存储库,在此示例中将它们称为 myproduct.git 和 myproduct_ugfx.git
  • 将我存储库的 master 分支推送到 myproduct.git 存储库。我没有写下这部分,但我想我只是为 origin 添加了一个远程并推送了 master:

    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

  • cd 进入子模块目录,修改子模块主分支名称为updates

    git branch -m master updates

  • 将远程源重命名为 bitbucket,更新分支(以前的 master)跟踪它

    git remote rename origin bitbucket

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

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

    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 树中添加几个文件。我将它们添加到 master 分支,提交,然后推送(它进入 Pi 存储库。)记住还要在子模块之外的目录上,运行 'git submodule sync'(不确定是否有必要),然后将这些更改提交并推送到 main/outer 存储库。

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

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

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