使用 monorepo 中的 yarn 工作区作为 git 模块



假设我配置了一个存储库,如下所示

repoX
|_ pkgA
|_ pkgB
|_ pkgC

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

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

约束:

  • repoXrepoY是私密
  • pkgABC纱线工作区
  • repoX不应仅
  • 供用户完全访问repoYpkgC

我认为通常有 3 种方法可以解决这个问题:

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

  1. 克隆存储库
  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 子树:您可以使用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咒语。

最新更新