git - 拆分一个 git 存储库以同时处理两个项目

标签 git git-submodules git-subtree

我正在开发一个用于我的项目的框架;然而,框架的开发可能会在没有上下文的情况下走得太远:也就是说,我需要开始在现实生活中的项目中使用它,并具体了解我需要添加、修复或调整的内容(也许是那些在测试环境中工作并不适用于现实情况,或者有些事情没有意义,或者我想添加功能)。

首先,由于 Framework 显然是一项正在进行的工作,我需要确保它在 Real-life project 中作为它,所以我可以回到框架,编辑它,提交,回到现实生活中的项目更新框架,继续处理项目。

其次,我实际上想要一种无需进行项目切换即可实现此目的的方法。我的意思是,我希望能够在真实项目 中编辑Framework,并将这些提交推送到Framework 存储库。

现在,我知道实现此目的的工具很可能是 git submodulegit subtree,但它们都非常令人困惑。特别是子模块,它似乎更倾向于只读方法(例如,让您的库始终更新):这会满足我的第一个要求,但不会满足第二个要求。

关于如何使用 Git 实现这一点以及工作流程的样子有什么建议吗?

最佳答案

这两种方法中的任何一种都会为您服务。

每个人都可以满足您的需要,就地编辑项目并将该特定内容推送到单独的存储库。

为了保持两个项目的运行,这两种方法都会产生一定的开销。

关于你提到的两点:

  • 使用子模块,您将在其他存储库的文件夹中拥有一个存储库。外层的(Real-Life)将子模块(Framework)存储库的位置和当前使用的提交保存在一个文件中。当你想编辑 Framework 时,你只需转到存储它的子文件夹,在那里它的行为应该就像你在一个完全独立的 git 存储库中一样,它有自己的远程和历史记录。修改 Framework 后,您返回 Real-Life 并更新子模块引用。该过程通常如下所示:

    Edit files in Framework
    Move to Framework subfolder
    Stage, commit, and push changes to Framework repository
    Go back to Real-Life folder
    Update Real-Life submodule reference
    
  • 使用子树,您可以在同一个存储库中处理 Real-Life 和 Framework,仍然将 Framework 代码保存在特定的子文件夹下。当您更改 Framework 中的内容时,您仍然会提交那些 Real-Life 存储库,就好像是单个项目一样。子树工具允许的是,您可以隔离框架文件夹中的更改,并从这些更改中创建一组独立于现实生活的提交,此提交将包含仅限框架的更改,并且可以推送到框架存储库。该过程如下所示:

    Edit files in Framework
    Stage, commit, and push to Real-Life repository
    Create Framework commits using subtree tools
    Push Framework specific commits to Framework repository
    

如果您仍然不确定这两者之间存在的权衡取舍,我建议您继续使用子模块。您会发现更多文档、用例,并且通常不那么复杂。它有一些缺点,但通过首先熟悉子模块,您可以衡量子树提供的内容。更多 info about submodules .

关于git - 拆分一个 git 存储库以同时处理两个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802156/

相关文章:

gitconfig 忽略 includeIf

git - 如何将 --relative 与 git format-patch 一起使用?

git - 上传大文件到Github,报错: remote disconnected

两次提交之间的 Git diff 中间没有一些提交

git - Android Studio 跨项目同步 git 子模块

git - 使用 Github 组织插件检查 Jenkins 中的子模块

Git:将一个项目的一部分包含到另一个项目中

git - 如何将文件夹从一个 Git 存储库共享到另一个?

git - 如何为具有私有(private) git 子模块的私有(private)仓库设置 GitHub Actions CI 服务?