0

假设我有一个配置为

repoX
|_ pkgA
|_ pkgB
|_ pkgC

是否可以将pkgCfromrepoX用作 git 子模块repoY

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

约束:

  • repoX并且repoY是私人的
  • pkgABC是纱线工作区
  • repoX不应repoY仅对用户完全可访问pkgC
4

1 回答 1

0

我认为通常有3种方法来处理这个问题:

#1 git submodules 解决方案:git submodules 要求您有一个顶级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 subtree:您可以使用它git subtree来解决问题。优点是它完全提取了历史,易于使用,我个人更喜欢它而不是子模块。思路如下:

  1. 将 pkgC 拆分为当前 repoX 中的子树并创建可获取的分支。
  2. 使用 git subtree pull 将分支合并到 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 咒语。

于 2019-12-27T07:50:14.577 回答