将子树发布到其他GIT存储库

将子树发布到其他GIT存储库,git,git-submodules,git-subtree,Git,Git Submodules,Git Subtree,我知道GIT中有子树和子模块,但我仍然不确定哪一个是我的最佳选择 所以情况是这样的: 我有一个“lib1”和“lib2”的项目,项目和回购已经存在,我不是从零开始 我希望将所有项目都保存在同一个GIT回购中,以便更容易地签入/签出,因为我主要处理该回购 项目不是开源的,但我想开源“lib2” 我永远不会只在“lib2”上工作,只在主项目中工作 我并不期望lib2能获得资金,因此从回购中合并lib2只是一个小问题 理想情况下,我希望这对从事该项目的其他开发人员是透明的(因此,当他们提交/推送时,

我知道GIT中有子树和子模块,但我仍然不确定哪一个是我的最佳选择

所以情况是这样的:

  • 我有一个“lib1”和“lib2”的项目,项目和回购已经存在,我不是从零开始
  • 我希望将所有项目都保存在同一个GIT回购中,以便更容易地签入/签出,因为我主要处理该回购
  • 项目不是开源的,但我想开源“lib2”
  • 我永远不会只在“lib2”上工作,只在主项目中工作
  • 我并不期望lib2能获得资金,因此从回购中合并lib2只是一个小问题
  • 理想情况下,我希望这对从事该项目的其他开发人员是透明的(因此,当他们提交/推送时,他们不需要知道下面有子树)

因此,我们的想法是能够利用“lib2”自身的历史推动它,使项目的其余部分保持私有。我知道关于这个主题已经有很多问题了,但我没有找到一个明确的答案。

您可以保持存储库的原样,使用以下方法导出此库:

git filter-branch --subdirectory-filer lib2
git帮助文件管理器分支
说:

   --subdirectory-filter <directory>
       Only look at the history which touches the given subdirectory.
       The result will contain that directory (and only that) as its project root.
——子目录过滤器
只查看涉及给定子目录的历史记录。
结果将包含该目录(并且仅包含该目录)作为其项目根目录。

项目开发人员不会注意到任何更改,因为没有更改。-但是,更新导出的库需要运行另一个筛选器分支。

这将对历史记录进行筛选,但如何将“lib2”推送到它自己的repo?那么我应该使用子树吗?它将创建一个只包含此目录的新分支。您可以简单地将该分支推送到另一个存储库:
git push otherrep branch
就像一个侧节点一样,这种方法可以工作,但是一旦您更改某些内容,就很难自动将内容推送到远程回购,因为在过滤分支+推送之后,您必须硬重置为head,以避免主回购出现问题