【问题标题】:Dealing with previous commits when open-sourcing a project [closed]开源项目时处理以前的提交[关闭]
【发布时间】:2012-02-10 00:55:20
【问题描述】:
有没有办法对某些用户隐藏提交?我想公开一个私人回购,但不希望人们看到我所有的旧提交。其中一些具有密码和 API 密钥。其他的与我想提供的内容完全无关。
私人仓库目前托管在 GitHub 上。我想打开开关,将其设为公开和开源,但这会暴露我不希望人们看到的旧提交。
我知道解决此问题的一种方法是创建一个全新的存储库,但我的帐户已达到存储库限制。寻找解决问题的最快和最简单的方法。对任何可行的方法持开放态度——包括创建一个新的 repo,如果这恰好是最好的方法。
【问题讨论】:
标签:
git
open-source
github
【解决方案1】:
如果您确实“隐藏”了这些提交,那么您实际上是在创建一个新的存储库。提交的 SHA1 取决于其所有内容及其父项,因此更改单个提交会更改之后的所有内容。
如果要隐藏的内容范围很大,最好不要导出任何历史记录。但希望事情是相当孤立的,您可以通过git filter-branch 解决您的问题。联机帮助页很好地描述了它的功能,包括一些玩具示例(例如如何从历史记录中删除文件),在线还有更多示例,包括这里。您最终可能会多次通过,例如一种用于删除某些文件,另一种用于删除某些类型的提交。
可能对您有用的关键事项:
--index-filter 将允许您删除或重命名一组给定的文件或目录 - 它只允许您修改索引,而不检查文件,因此速度很快;
--env-filter 将让您非常快速地重写作者/提交者信息;和
--tree-filter,最后的手段,实际上会在每一步检查整个树,并让您就地修改文件(例如搜索和替换以删除密码)
filter-branch 完全重写您指定的任何 refs 上的所有历史记录,并将原始 refs 保留在 refs/originals 中以备不时之需。出于多种原因,其中最重要的是安全性,最好在新的克隆中使用它。
【解决方案2】:
无法在存储库中为其他用户隐藏提交。
从好的方面来说,您可以在本地存储库中做任何您想做的事情,包括重写历史以压缩或省略这些提交。
然后,为了安全起见,克隆另一个私有存储库,删除它,创建一个新的,然后从修改后的版本推送到新存储库。
这利用了 git 存储库的任何克隆都是完整的事实......
【解决方案3】:
您可以将提交压缩在一起或将当前代码导出到新存储库,但是,这确实违背了开源项目的目的。如果有人检测到一个错误,想要跟踪它是如何进入代码的,但因为它是在你压缩的提交中引入的,怎么办?