GitHub:使私有存储库部分公开

Posted

技术标签:

【中文标题】GitHub:使私有存储库部分公开【英文标题】:GitHub: Make a private repository partially public 【发布时间】:2017-10-30 21:25:00 【问题描述】:

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

现在我想让这个存储库部分公开,这样:

    用户可以使用issues功能提出问题或写需求,我可以回复他们,我们可以讨论。

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

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

谁能告诉我应该遵循哪些步骤(和理想的命令)?

我是否必须重新组织我的文件夹,例如,创建一个公共文件夹和一个私人文件夹?

【问题讨论】:

【参考方案1】:

首先要了解的是 GitHub 权限模型。要提交问题等,需要 一些 级别的回购权限。阅读应该足够了。

但阅读确实也意味着“能够查看所有代码和历史记录”。并且能够看到甚至意味着能够复制和分叉,即使您控制可以写回您的存储库的内容。并且没有低于“读取(所有代码)”的访问级别。

因此,如果您想保留自己的代码,那么在 github 之外创建某种项目页面,并在那里利用专门的问题跟踪系统,可能对您正在尝试做的事情更有意义。

如果你决定一些代码应该是公开的,那么你必须有两个回购。如果可以更好地满足您对该代码子集的需求,则可以将带有公共代码的 repo 设置为只读或读/写。无论哪种方式,它都可以主持问题讨论等。

将代码子集拆分为公共回购并不困难,但如果您希望公共回购也有完整的历史记录,那就更难了。您将希望避免创建两个不同的公共代码历史记录,因此您可能必须从私有存储库中删除公共代码。 (它可以作为子模块重新引入 - 一个指向公共 repo 的链接 - 但在最简单的情况下,这确实意味着您需要将公共代码组织在一个目录下。)

如果只需要公开当前版本,那就很简单了。您初始化新的 repo,将文件从一个移动到另一个,如果需要,创建子模块链接。

如果您想发布已发布文件的历史记录,那么您必须执行git filter-branch 之类的操作,以从(克隆)原始存储库创建公共存储库。确切的过程取决于确切的要求,但通常您可以使用(a)subdirectory-filter 仅发布一个目录的内容(到新仓库的根目录) - 但听起来您的代码没有安排让这变得容易;或 (b) index-filter 删除您想要保密的文件(同时为保留的文件保留现有目录结构);或 (c) tree-filter 和您喜欢移动、删除或添加文件的复杂脚本,将“原始回购”版本转换为相应的“公共回购”版本。

如果您确实拆分了历史记录,您可能仍希望将公共文件的历史记录保留在原始存储库中,因为链接存储库的历史记录相当困难。在大多数情况下,这并不是一个巨大的实际限制,除非历史的规模相当大。

【讨论】:

感谢您的回答。我真的很喜欢 Github 的“问题”作为“问题跟踪系统”。您认为创建一个包含一些项目页面的 Github 存储库以主要使用其“问题”功能是否可以接受? 我想我不知道是什么让它“可接受”或其他。我不记得看到它完成了,可能是因为存在专门关注问题管理但没有集成源代码控制的网站;但我不知道你为什么不能,如果这真的是你想做的事【参考方案2】:

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

【讨论】:

抱歉,我刚找到this post,是不是和你的方法不一样? 从快速浏览来看,这是一种不同的方法(而顶部的更新正是我所说的)不适用于您。他们的私人仓库不在 GitHub 上,而是在其他地方或 purley 本地。他们准备一个只包含要共享的文件的分支,然后只将该分支推送到 GitHub 存储库。这也是一种涉及两个独立存储库的方法,一个包含公共内容,一个包含私有和公共内容,公共内容有一个单独的分支,这是唯一一个推送到公共远程的。我会说相当笨重和脆弱。【参考方案3】:

您肯定需要两个存储库。但是您可以自动创建公共部分。

例如,您可以使用git-exporter。它允许您定义公共存储库中可用的文件路径。此实用程序基于具有类似提交历史的现有存储库创建一个新的 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

【讨论】:

以上是关于GitHub:使私有存储库部分公开的主要内容,如果未能解决你的问题,请参考以下文章

私有 Github 存储库的私有页面

私有存储库的 GitHub 页面 [关闭]

从私有存储库切换到公共存储库,但 github 页面不发布站点

Github 环境

使用 GitHub Actions 从私有 GitHub 存储库安装 npm 模块

如何使 ECR 存储库公开?