我在GitHub上用
html + css + javascript
搭建了一个项目半年了。它一直在一个私人存储库中,只有一个分支。
现在我想让这个存储库部分公开,这样:
用户可以使用
issues
功能提出问题或写需求,我可以回复,我们可以讨论。
其实,用户不需要看代码。但由于我们在 GitHub 上,我可能想公开一小部分文件。
我不想丢失提交历史记录。
谁能告诉我应该遵循哪些步骤(最好是命令)?
我是否需要重新组织我的文件夹,例如创建一个公共文件夹和一个私人文件夹?
首先要了解的是GitHub权限模型。 要提交问题等,需要对存储库具有“某种”级别的权限。 阅读应该足够了。 但是 read
does也意味着“能够查看所有代码和历史记录”。 甚至能够看到意味着能够复制和分叉,即使您控制可以写回存储库的内容。 并且没有比“读取(所有代码)”更低的访问级别。 因此,如果您想保留自己的代码,那么在 github 之外创建某种项目页面,并利用那里的专用问题跟踪系统,可能对您想要做的事情更有意义。
如果您确实决定
某些代码应该公开,那么您必须拥有两个存储库。 包含公共代码的存储库可以设置为只读,或者读/写(如果这样可以更好地满足您对该代码子集的需求)。 无论哪种方式,它都可以主持问题讨论等。 将代码子集拆分到公共存储库中并不“太难”,但如果您希望公共存储库也具有完整的历史记录,那就更难了。 您需要避免创建公共代码的两个不同的历史记录,因此您可能必须从私有存储库中删除公共代码。 (它可以作为子模块重新引入 - 公共存储库的链接 - 但在最简单的情况下,这确实意味着您需要将公共代码组织在单个目录下。)
如果只需要公开当前版本,那就很简单了。 您初始化新的存储库,将文件从一个存储库移动到另一个存储库,如果需要,可以创建子模块链接。 如果您想发布已发布文件的历史记录,那么您必须执行类似
git filter-branch
的操作才能从原始存储库(克隆)创建公共存储库。 确切的过程取决于确切的要求,但通常您可以使用 (a) a
subdirectory-filter
来仅发布一个目录的内容(到新存储库的根目录) - 但听起来您的代码未安排让这变得容易;或 (b)
index-filter
删除您想要保密的文件(同时保留剩余文件的现有目录结构);或 (c) 一个 tree-filter
以及您喜欢移动、删除或添加文件的复杂脚本,将“原始存储库”版本转换为相应的“公共存储库”版本。如果您确实分割了历史记录,您可能仍然希望将公共文件的历史记录保留在原始存储库中,因为链接存储库的历史相当困难。 大多数时候,这并不是一个巨大的实际限制,除非历史记录的规模相当大。
您肯定需要两个存储库。但您可以自动创建公共部分。
。它允许您定义公共存储库中可用的文件路径。该实用程序基于具有相似提交历史记录的现有 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
。
您甚至需要两个单独的存储库。代码要么公开,要么不公开。您不能仅公开部分文件。除非您将这些文件打包为存档并在存储库的下载部分中提供它们。但是,如果您想让它们作为存储库可用,您需要将存储库分成两半,例如。 g。与
git filter-tree
--subtree-filter
。
将您想要私有的代码作为包制作,并使用公共存储库中的包作为依赖项。