对于具有私有资产的公共仓库,克隆、子模块和子树之间有什么区别?

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

背景:

我和一个小团队正在

Main-Repo
组建一个项目。我们希望
Main-Repo
最终开源。然而,
Main-Repo
需要使用我们不想开源的资产。我们目前将这些资产保留在
Assets-Repo
中。
Main-Repo
上的所有协作者都可以访问
Assets-Repo

问题

我们不知道将

Assets-Repo
嵌入到
Main-Repo
的文件结构中的最佳方法。我们预计
Main-Repo
的文件结构将如下所示:

Main-Repo
|_.gitignore
|_ main.file
|_...
|_Assets-Repo
  |_privateImage.png
  |_privateAudio.mp3
  |_...

Git 克隆 + .gitignore

这是我们最初的想法——我们将

Assets-Repo
克隆到本地
Main-Repo
中,并将
Assets-Repo
文件夹添加到我们的
.gitignore
中,以使其远离
Main-Repo
的源代码控制。 这意味着我们必须定期 cd 到
Assets-Repo
来进行或拉取更改,但看起来并没有太多开销。此外,它应该保持我们所有信息的独立和私密。

但是,当我去提交将

Asset-Repo
克隆到
Main-Repo
的更改时,我收到了以下警告:

You've added another git repository inside your current repository. Clones of the outer repository will not contain the contents of the embedded repository and will not know how to obtain it.
If you meant to add a submodule, use:
git submodule add <url> Assets-Repo

If you added this path by mistake, you can remove it from the
index with:

git rm --cached Assets-Repo

See "git help submodule" for more information.

子模块解决方案

我的理解是子模块是考虑到第三方模块而制作的。此外,如果没有访问

Main-Repo
,我们的
Assets-Repo
将无法运行。我读到,虽然它可以用来保持私有存储库分离,同时让用户克隆父存储库,但它增加了大量的开销。对私有存储库进行子模块与
.gitignoring
来自父存储库的子模块之间是否有有意义的区别?

子树解决方案

我的理解是,如果

Assets-Repo
Main-Repo
的子树,它将获得
Assets-Repo
的快照。我看到有人提到很难使子树保持最新,这是行不通的,因为我们在
Assets-Repo
中工作时将添加到
Main-Repo

问题

对于公共存储库中的私有存储库,两者都由相同的协作者控制,通过克隆+ .gitignore、子模块和子树嵌入私有存储库有何优缺点?为任一存储库做出贡献的流程是什么?

git github repository git-submodules git-subtree
1个回答
0
投票
  • git clone
    +
    .gitignore
    这只是手动下载资源的简单方法。 无法保证您正在使用与隔壁同事相同版本的assets

  • git submodule
    这是实现相同目标的更奇特的方法。 最大的区别是,父存储库跟踪应该使用哪个版本的 assets(使用父存储库的特定版本)。

如果您的资产变化很大(看起来确实如此),那么您可能希望确保父存储库和资产之间存在一定的一致性。

  • git subtree
    这将使子树存储库成为父存储库的一部分。 与“普通提交”的唯一区别是,有一些额外的元数据可以更轻松地与子树的原始源同步。 最重要的是:您不需要访问子树的源来克隆整个事物。

因此,对于您的用例,

git subtree
可能不会成功:您的私有资产将成为公共存储库的一部分 - 每个克隆公共存储库的人也会获得私有资产。

git submodule
似乎对你的情况最有用。 但是,使用私有子模块,您基本上可以防止任何人对您的存储库进行“完整克隆”。 如果您还有other(公共)子模块,贡献者将很难克隆您的存储库,因为他们要么想要克隆all子模块(当他们到达私有子模块时,这会给他们一个错误)或none(这可能会禁止所需的依赖项)。

您可能应该重新考虑依赖链,并且:

  • 使公共存储库仅依赖于public子项目(如果有)。
  • 使用(私有)元存储库进行集成,这取决于公共和私有存储库。
© www.soinside.com 2019 - 2024. All rights reserved.