在一个 git 存储库中维护多个不相关的历史记录
Maintaining multiple unrelated histories in one git repository
我的用例:我想创建几个小示例程序,并将它们全部存储在 examples/
存储库中。当有人签出 examples/a
时,我希望他们能够 运行 git log
并且只看到与 a/
相关的提交,而没有 [=15] 的大量无关提交=] c/
d/
和 e/
.
我知道 git submodule
或 git 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
中,这就是机器的全部设置。
我的用例:我想创建几个小示例程序,并将它们全部存储在 examples/
存储库中。当有人签出 examples/a
时,我希望他们能够 运行 git log
并且只看到与 a/
相关的提交,而没有 [=15] 的大量无关提交=] c/
d/
和 e/
.
我知道 git submodule
或 git 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
中,这就是机器的全部设置。