在一个 git 存储库中维护多个不相关的历史记录

Maintaining multiple unrelated histories in one git repository

我的用例:我想创建几个小示例程序,并将它们全部存储在 examples/ 存储库中。当有人签出 examples/a 时,我希望他们能够 运行 git log 并且只看到与 a/ 相关的提交,而没有 [=15] 的大量无关提交=] c/ d/e/.

我知道 git submodulegit subtree 可以做到这一点,但它们都需要单独的存储库,我认为不值得为每个文件创建 50 个不同的存储库。我希望他们都生活在一个回购协议中,但保持不同的历史。这可能吗?

是的,绝对是。您可以在存储库中获取或创建您喜欢的任何历史结构。在 examples 中创建一个新的空分支的最简单方法是

git worktree add examples/new $(git commit-tree -mstub.message `git mktree <&-`)

并使用您的第一组内容修改存根提交。

我也经常使用它来携带“合并的子模块”,实用代码总是需要但与其他项目共享,git submodule 命令显然是可选的,但很容易将其骗到使用此设置,告诉它你已经克隆了上游模块,例如utils 分支中的“utils”历史我会

git submodule init utils
git worktree add utils :utils

克隆,

[submodule "utils"]
    path = utils
    url = ./
    branch = utils

.gitmodules中,这就是机器的全部设置。