将Monorepo的纱线工作区用作git模块

问题描述 投票:0回答:1

比方说,我有一个像这样配置的仓库

repoX
|_ pkgA
|_ pkgB
|_ pkgC

是否可以将pkgC中的repoX用作repoY中的git子模块?

repoY
|_ pkgX
|_ pkgC (-> repoX)

约束:

  • [repoXrepoY是私有的
  • [pkgABC是纱线工作区
  • [repoX不应仅对repoY中的用户完全访问pkgC
git github yarn monorepo yarn-workspaces
1个回答
0
投票

我认为通常有3种处理方式:

#1个git子模块解决方案:git子模块要求您具有顶级pkgC存储库。您可以使用git-filter-repo定期生成它,推荐使用git filter-branch。这个想法:

  1. Clone repoX
  2. 将克隆重写为仅包含来自pkgC /的历史记录
  3. 使用新仓库作为子仓库。
  4. 重复。例如:
set -x
set -e

git clone repoX repoX-to-rewrite
git -C repoX-to-rewrite filter-repo--subdirectory-filter pkgC/
git -C repoY submodule add repoX-to-rewrite pkgC

此解决方案有各种缺点,我强烈建议不要这样做。它要求您重写历史记录。最重要的是,它涉及破坏性操作filter-repo/filter-branch,可能会出错。

#2 git subtree:您可以使用git subtree解决此问题。优点是,它可以完全提取历史记录,易于使用,并且我个人更喜欢它而不是子模块。想法如下:

  1. 将pkgC拆分为当前repoX中的子树并创建可获取的分支。
  2. 使用git子树拉合并合并到repoY。
  3. 重复。
set -x
set -e
# split a subtree. this is a save operation
git -C repoX subtree split -b upstream-pkgc pkgC
# add to repoY
git -C repoY subtree add --prefix pkgC ../repoX upstream-pkgc

## to update
# split a subtree and then merge it into repoY. this should be a fast-forward since
# subtree splits are stable.
git -C repoX subtree split -b upstream-pkgc pkgC
git -C repoY subtree pull --prefix pkgC ../repoX upstream-pkgc

这是一个很好的解决方案。您的脚本可能还需要处理一些其他详细信息,并提供一些选项供您选择(例如,您要使用--squash),但通常情况下可以正常工作。

#3 pkg管理:根据您使用的pkg管理器,您可以将pkgC发布到内部托管程序包注册表,然后使用yarn之类的东西将其从此处拉出。如果您有该选项,那可能是最自然的方法,不需要git咒语。

© www.soinside.com 2019 - 2024. All rights reserved.