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 页面不发布站点