2009-02-20 105 views
3

我有一个项目依赖于使用子树合并策略合并的另外两个子项目(如和there)?如何删除git子树合并?

过了一段时间,我注意到其中一个子项目在当前项目中有自己的生命周期,所以我想将它与原始项目分离,但我不知道如何实现这一目标。

基本上,我已经注意到子项目被列在.git/config文件中,所以我想知道是否足以从那里删除它。

继Jakub的回答/问题后,我会尝试在我的问题中添加更多详细信息。我正在从事ProjectA的项目取决于库LibraryB,它拥有自己的git存储库和自己的生命周期。 在设置ProjectA时,我使用了子树合并技术来添加LibraryB的依赖关系(这些步骤与VonC感谢添加的链接中描述的步骤完全相同)。 现在,ProjectA需要对LibraryB进行一些自定义更改,这些更改通用性不足以被推回到LibraryB存储库。因此,我想将ProjectA中的LibraryB与其主存储库解耦(通过解耦,我的意思是ProjectA中的LibraryB将无法从其主存储库进行更新,并且只会在ProjectA内跟踪其自己的历史记录)。

更多细节:检查我的项目A仓库后,我想通了,唯一的参考LibraryB在项目A/git的/ config文件库的生命形式:

[remote "gaelib"] 
    url = ../libraries/gaelib 
    fetch = +refs/heads/*:refs/remotes/gaelib/* 

并没有相关的额外的git在目录LibraryB信息被纳入项目A(../libraries/gaelib)

+0

您似乎忘记了包含脚注[1]的链接。 – foxxtrot 2009-02-20 21:58:16

回答

0

如果你想保持自己LibraryB的版本,你有几种选择:

  • 您可以让LibraryB成为您项目的固有部分:只需在配置文件中删除或注释掉[remote "LibraryB"]部分,然后在您的项目中更改LibraryB。

    的缺点是,它会更难发送补丁的规范(第三方)LibraryB

    版本
  • 您可以继续使用“树”合并,而不是从LibraryB的规范版本,但是从你自己的克隆(fork)这个库。您可以将remote.LibraryB.url更改为指向本地版本,并且您的本地版本将是原始LibraryB的克隆。请注意,您应该合并自己的分支,而不是规范的LibraryB的远程跟踪分支。

    缺点是您必须维护单独的克隆,并且要记住您自己的更改(以及至少那些通用)到LibraryB必须在LibraryB的分支中进行,而不是直接在ProjectA内部进行。

  • 您可能希望从“子树”合并将ProjectA和LibraryB的历史交织到使用submoduletutorial)可以实现更多分离。在这种情况下,您可能需要单独的LibraryB库(fork),但它将位于ProjectA的工作区域内; ProjectA中的提交将不会让LibraryB的树作为子树,而是指向LibraryB存储库中的提交。然后,如果你不想遵循LibraryB开发,那么简单地不使用'git submodule update'就足够了(也许只是在注释掉或删除链接到规范版本的LibraryB的时候)。

    这样做的好处是可以轻松地将您的改进发送给规范库B,并且可以在ProjectA工作区内进行更改。它不利于学习稍微不同的工作流程。

    此外,还有一个如何从'子树'合并到子模块的问题。您可以:

    • 从子树合并移动通过在上层项目子项目子树创建git仓库的工作库(即“git的初始化”内部适当的子目录+适当的“混帐子模块初始化”等)子模块。这意味着你将有'子树'直到历史的某个点,然后子模块。
    • 使用git filter-branch重写历史记录以通过子模块替换子树合并。这具有重写历史的缺点(如果有人以他/她的当前历史记录为基础,那么是大否)以及“干净开始”的优势。 或者你可以稍等一下对“混帐子模块拆分”(thread on git mailing list),使之成为混帐...
      不幸的是Splitting a git repository博客帖子返回“找不到主机”

我希望这个版本解决你的问题。

免责声明:我已经使用既不子树合并,也不子模,也不git的过滤分行个人。

+0

我试图提供尽可能多的细节,因为我可以弄清楚。感谢您试图解决我的问题。 – alexpopescu 2009-02-22 12:23:48

+0

扩展答案地址你的问题更好吗? – 2009-02-24 20:40:05

3

我不明白。如果使用子树合并方法将libraryB包含在projectA存储库中,则不必进行任何解耦。您已经准确地满足您的需求:

  • 您可以从libraryB存储库中将更新提取到libraryB。我猜,这是一件好事。

  • 您可以在projectA的存储库中提交对库B的更改。除非您决定将这些更改推送到其他存储库,否则这些更改将保留在本地存储库中。它们只是projectA历史记录的一部分,不会自动传播到libraryB存储库。

这就是子树合并方法的全部要点,而不是子模块方法。

2

是的,从配置文件中删除远程指向libraryB。这将防止任何人使用您的回购从无意中更新您的本地代码从远程。

除此之外,您不需要做任何其他事情 - 您只需不再从LibraryB仓库中取出或推入库存仓库。

4

这听起来像你想“撤消”一个子树合并,并将其提交回上游。 git subtree split命令应该这样做。