GitHub:如何将私有仓库部分内容公开?

17

我在GitHub上用 html + css + javascript 建了一个项目已经半年了,一直放在私有仓库里,只有一个分支。

现在我想把这个仓库部分公开,以便于:

  1. 用户可以使用 issues 功能提问或写需求,我可以回答他们,我们可以讨论。

  2. 事实上,用户不需要看到代码。但是由于我们在GitHub上,我可能想要公开一小部分文件。

  3. 我不想丢失提交历史记录。

有人能告诉我应该遵循哪些步骤(最好是命令),才能做到这一点吗?

我是否需要重新组织我的文件夹,例如创建一个公共文件夹和一个私有文件夹?

3个回答

4
首先要理解 GitHub 的权限模型。为了提交问题等,需要对 repo 有一定的权限。读取权限应该足够了。
但是“读取”也意味着“能够看到所有代码和历史记录”。并且“能够看到”甚至意味着能够复制和派生,尽管您可以控制可以写回到您的 repo 的内容。而且没有比“读取(所有代码)”更低的访问级别。
因此,如果您想将代码保留在自己手中,那么创建一个与 Github 分开的项目页面,并在其中利用专门的问题跟踪系统,可能更符合您尝试做的事情。
如果您决定某些代码应该公开,那么您必须有两个 repo。公共代码的 repo 可以设置为只读,或者如果对于代码子集更好地满足您的需求,则可设置为读/写。无论哪种方式,它都可以托管问题讨论等等。
将代码子集拆分为公共 repo 不太困难,但如果您希望公共 repo 也具有完整的历史记录,则会更加困难。您需要避免在私人 repo 和公共 repo 中创建两个不同的历史记录,因此您可能需要从私人 repo 中删除公共代码。(它可以作为子模块重新引入-公共 repo 的链接-但在最简单的情况下,这意味着您需要将公共代码组织在单个目录下。)
如果只需发布当前版本,则很简单。您可以初始化新 repo,将文件从一个 repo 移至另一个 repo,并创建子模块链接(如果需要)。
如果要发布已发布文件的历史记录,则必须执行类似于“git filter-branch”的操作,以从原始 repo(的克隆)创建公共 repo。确切的过程取决于具体要求,但通常您可以使用(a)“子目录过滤器”仅发布一个目录的内容(到新 repo 的根目录) - 但听起来您的代码并没有这样安排,因此这可能有些困难;或者(b)使用“索引过滤器”删除您想保留私有的文件(同时保留其余文件的现有目录结构);或者(c)使用复杂的脚本作为“树形过滤器”,移动、删除或添加文件,将“原始 repo”版本转换为相应的“公共 repo”版本。
如果您确实拆分了历史记录,那么您可能仍然希望在原始 repo 中保留公共文件的历史记录,仅因为链接 repo 的历史记录相当困难。除非历史记录的大小很大,否则这不是大问题。

谢谢你的回答。我非常喜欢Github的“问题”作为“问题跟踪系统”。你认为创建一个Github存储库并使用其“问题”功能来管理项目页面是否可行? - SoftTimur
我想我不知道什么会使它“可接受”或者不可接受。我不记得看到过这样的做法,可能是因为存在专门关注问题管理而没有集成源代码控制的网站;但如果这真的是你想做的事情,我不知道为什么你不能这样做。 - Mark Adelsberger

3
你肯定需要两个代码仓库。但是你可以自动创建一个公共部分。
例如,你可以使用git-exporter。它允许你定义公共代码仓库中可用的文件路径。此实用程序基于现有的 Git 仓库创建一个新的 Git 仓库,并具有类似的提交历史记录。只有被允许的文件将包含在提交内容中。
示例:
创建config.json:
{
    "forceReCreateRepo": true,
    "targetRepoPath": "my-open-source-repo",
    "sourceRepoPath": ".",
    "allowedPaths": ["build/*"],
    "ignoredPaths": ["src/*"]
}

然后运行命令 npx gitexporter config.json
这样,一个新的存储库 my-open-source-repo 将被创建,其中只包括特定的文件,同时保留整个提交历史记录。
然后,您可以推送 my-open-source-repo 并将其用作开源项目。
像这样:
cd my-open-source-repo
git remote set-url origin new.github.com/username/open-source-repo-name
git push origin master

您还可以创建一个 CI 脚本,以便自动更新您的公共 my-open-source-repo

1
你甚至需要两个独立的代码库。无论代码是否公开,你都不能只公开部分文件。除非你将这些文件打包成归档文件,并在仓库的下载部分提供它们。但如果你想将它们作为仓库可用,你需要将代码库分成两半,例如使用 git filter-tree--subtree-filter

抱歉,我刚刚发现了这篇文章,它的方法与你的不同吗? - SoftTimur
1
从快速浏览来看,这是一种不同的方法(尽管顶部的更新与我所说的完全相同),不适用于您。他们在 GitHub 上没有私有存储库,而是在其他地方或纯本地拥有。他们准备了一个仅包含要共享的文件的分支,并将仅该分支推送到 GitHub 存储库。这也是一种涉及两个单独的存储库的方法,一个具有公共内容,一个具有私人和公共内容,为公共内容准备一个单独的分支,该分支是唯一推送到公共远程的分支。我认为这相当麻烦和脆弱。 - Vampire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接