我正在开发一个用于我的项目的框架;然而,框架的开发可能会在没有上下文的情况下走得太远:也就是说,我需要开始在现实生活中的项目中使用它,并具体了解我需要添加、修复或调整的内容(也许是那些在测试环境中工作并不适用于现实情况,或者有些事情没有意义,或者我想添加功能)。
首先,由于 Framework 显然是一项正在进行的工作,我需要确保它在 Real-life project 中作为它,所以我可以回到框架,编辑它,提交,回到现实生活中的项目更新框架,继续处理项目。
其次,我实际上想要一种无需进行项目切换即可实现此目的的方法。我的意思是,我希望能够在真实项目 中编辑Framework,并将这些提交推送到Framework 存储库。
现在,我知道实现此目的的工具很可能是 git submodule
和 git 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/