【发布时间】:2011-06-09 03:35:40
【问题描述】:
我目前正在开源一个我们一直在我们自己的私人 git 服务器上开发的项目。我们希望在 GitHub 上开源该项目的部分,因为仍有一些功能需要解决。
特别是,假设我的 git repo 中有以下目录:
- 子目录 1(公共)
- 子目录 2(公共)
- 子目录 3(私有)
我们希望公开目录 1 和 2,同时保持目录 3 不公开。有什么好办法吗?
【问题讨论】:
标签: git open-source repository
我目前正在开源一个我们一直在我们自己的私人 git 服务器上开发的项目。我们希望在 GitHub 上开源该项目的部分,因为仍有一些功能需要解决。
特别是,假设我的 git repo 中有以下目录:
我们希望公开目录 1 和 2,同时保持目录 3 不公开。有什么好办法吗?
【问题讨论】:
标签: git open-source repository
我最好的猜测是你想使用submodules。您可以让您的顶级目录只包含这三个子模块。两个将公开,一个不公开。
父项目只知道子模块所需的提交SHA1,因此它不会包含有关私有项目的任何实际信息。
如果您不想保留历史记录,只需将这三个目录复制到新位置,在其中运行 git init,然后提交即可。
如果您确实想保留历史记录,则需要执行以下操作:
git clone original-project project1
cd project1
git filter-branch --prune-empty --subdirectory-filter subdir1 -- --all
每个子项目一次。 filter-branch 命令重写历史,只保留给定的子目录作为顶层。这显然具有潜在的破坏性(尽管它会在refs/originals/* 中留下参考副本),因此在单独的克隆中执行此操作非常重要!
无论哪种情况,您都将创建自己的超级项目:
mkdir superproject
cd superproject
git init
git submodule add <URL of central project1 repo>
git submodule add <URL of central project2 repo>
git submodule add <URL of central project3 repo>
git commit
使用中心网址很重要;当人们克隆您的超级项目并运行 git submodule update --init 时,它会从这些 URL 中克隆子模块。
【讨论】: