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

时间:2013-09-14 13:16:40

标签: git git-submodules git-subtree

我正在开发一个框架以用于我的项目;然而,框架的开发到目前为止没有上下文:即我需要开始在现实项目中使用它,并具体看看我需要添加,修复或调整(也许是在一个测试环境中工作,不适合现实生活中的情况,或者某些事情没有意义,或者我想添加功能。)

首先,由于框架显然是正在进行的工作,我需要确保它在现实生活项目中保持更新,作为其他部分它,所以我可以回到Framework,编辑它,提交,回到Real-life项目更新框架内,继续使用该项目。

其次,我真的想要一种在不进行项目切换的情况下实现这一目标的方法。我的意思是,我希望能够在现实生活项目中编辑框架,并将这些提交推送到框架存储库。< / p>

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

有关如何使用Git实现此目的的任何指示以及工作流的外观如何?

2 个答案:

答案 0 :(得分:4)

这两种方法中的任何一种都可以为你服务。

每个人都可以提供您所需的内容,编辑项目并将该特定内容推送到单独的存储库。

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

关于你提到的两点:

  • 使用子模块,您可以在其他存储库的文件夹中拥有存储库。外部(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
    
  • 使用Subtrees,您可以在同一个存储库中使用Real-Life和Framework,仍然将Framework代码保存在特定的子文件夹下。当您更改Framework中的内容时,您仍然会将这些Real-Life存储库提交为单个项目。子树工具允许的是,您可以隔离Framework文件夹中的更改,并从这些创建中创建一组独立于Real-Life的提交,此提交将包含仅限Framework的更改,并且可以推送到Framework库。这个过程看起来像这样:

    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

答案 1 :(得分:-1)

Git中的分支是其众多强大功能之一。如果您使用过其他版本控制系统,那么忘记大部分关于分支的内容可能会有所帮助 - 实际上,将它们视为上下文可能会更有帮助,因为这是您最常使用它们的方式。当您签出不同的分支时,您可以更改正在使用的上下文,并且可以在几个不同的分支之间快速上下文切换。

简而言之,您可以使用git branch(branchname)创建分支,使用git checkout(branchname)切换到该上下文,在该上下文中记录提交快照,然后可以轻松地来回切换。切换分支时,Git会将您的工作目录替换为该分支上最新提交的快照,因此您不必为多个分支创建多个目录。您使用git merge将分支合并在一起。您可以随着时间的推移轻松地从同一分支合并多次,或者您可以选择在合并后立即删除分支。