git:如何从项目中分离库?filter-branch,subtree?

Paŭ*_*ann 23 git git-submodules git-filter-branch git-subtree

所以,我有一个更大的(闭源)项目,并且在这个项目的上下文中创建了一个在其他地方也可以使用的库,我想.

我现在想要在自己的项目中拆分库,它可以作为github或类似的开源.当然,图书馆(及其历史)应该不包含我们项目的痕迹.

git-subtree在这里似乎是一个解决方案,但它并不完全适合.

我的目录布局是这样的(因为它是一个Java项目):

  • 击剑比赛 (git workdir)
    • SRC
        • fencing_game
          • 运输 (我的图书馆)
            • 协议 (图书馆的一部分)
            • fencing (与库连接的主项目的一部分)
            • 客户端(与库连接的主项目的一部分)
            • server (与库连接的主项目的一部分)
          • 客户(主要项目的一部分)
          • 服务器(主项目的一部分)
          • ...... (主要项目的一部分)
    • 其他文件和目录(构建系统,网站等 - 主要项目的一部分)

拆分后,我希望库的目录布局如下所示(包括直接在粗体目录中的任何文件):

  • 我的图书馆(名字待定)
    • SRC
        • fencing_game
          • 运输 (我的图书馆)
            • 协议 (图书馆的一部分)

历史记录还应该只包含主项目历史中涉及存储库这一部分的部分.

第一眼看到了我git-subtree split --prefix=src/de/fencing_ame/transport,但这会

  1. 给我一棵树根transport(不会编译)和
  2. 包括transport/client,transport/servertransport/fencing目录.

第一点可以通过git subtree add --prefix=src/de/fencing_ame/transport <commit>在接收端使用来缓解,但我不认为git-subtree可以对导出这些子目录做很多事情.(这个想法真的是只能在这里分享完整的树).

我必须在git filter-branch这里使用吗?

拆分后,我希望能够导入回库在我的主要项目中,无论是使用Git树或混帐子模块,在一个单独的子目录,而不是它现在是.我想象这样的布局

  • 击剑比赛 (git workdir)
    • SRC
        • fencing_game
          • 运输 (空)
            • fencing (与库连接的主项目的一部分)
            • 客户端(与库连接的主项目的一部分)
            • server (与库连接的主项目的一部分)
          • 客户(主要项目的一部分)
          • 服务器(主项目的一部分)
          • ...... (主要项目的一部分)
    • 我的图书馆
      • SRC
          • fencing_game
            • 运输 (我的图书馆)
              • 协议 (图书馆的一部分)
    • 其他文件和目录(构建系统,网站等 - 主要项目的一部分)
什么是最无痛的方法呢?是否有其他工具而不是git-subtree和git-filter-branch用于此目标?

Joh*_*hat 1

项目的历史只是为了你的利益,还是为了github上的人的利益?

如果历史只是为了您的利益,有一个简单的方法使用移植物。基本上,只需为 github 创建一个全新的存储库,删除所有专有代码。现在您拥有了一个仅包含公共代码的开源存储库,您可以将其推送到 github。在开源存储库的本地副本中,您可以将专有存储库中的历史记录移植到开源存储库上。

这样做意味着您(或有权访问专有存储库的任何人)可以看到完整的历史记录,但公众只能看到您开源代码时的代码。

.git/info/grafts 是做什么用的?