我想在GitHub上放置一个Git项目,但它包含某些包含敏感数据的文件(用户名和密码,例如Capistrano的/config/deploy.rb)。
我知道我可以将这些文件名添加到.gitignore ,但这不会删除它们在Git中的历史记录。
我也不想通过删除/.git目录重新开始。
有没有一种方法可以删除您Git历史记录中特定文件的所有痕迹?
#1楼
更改密码是一个好主意,但是对于从存储库历史记录中删除密码的过程,我建议使用BFG Repo-Cleaner ,它是git-filter-branch
一种更快,更简单的替代方法,明确地设计用于从Git存储库中删除私有数据。
创建一个private.txt
文件,列出要删除的密码等(每行一个),然后运行以下命令:
$ java -jar bfg.jar --replace-text private.txt my-repo.git
存储库历史记录中所有阈值大小(默认为1MB以下)的文件都将被扫描,并且所有匹配的字符串(不在您的最新提交中)都将替换为字符串“ *** REMOVED ***”。 然后,您可以使用git gc
清除失效的数据:
$ git gc --prune=now --aggressive
BFG通常比运行git-filter-branch
快10至50倍,并且针对以下两种常见用例简化并定制了选项:
- 删除疯狂的大文件
- 删除密码,凭据和其他私人数据
完全公开:我是BFG Repo-Cleaner的作者。
#2楼
因此,它看起来像这样:
git rm --cached /config/deploy.rb
echo /config/deploy.rb >> .gitignore
从git中删除跟踪文件的缓存,然后将该文件添加到
.gitignore
列表中
#3楼
要明确:接受的答案是正确的。 请先尝试。 但是,对于某些用例来说,它可能会不必要地变得复杂,尤其是当您遇到令人讨厌的错误,例如“致命:错误的修订版-删节-清空”,或者真的不在乎您的回购记录时。
一种替代方法是:
- cd到项目的基础分支
- 删除敏感代码/文件
- rm -rf .git /#从代码中删除所有git信息
- 转到github并删除您的存储库
- 遵循本指南,将您的代码像往常一样推送至新的存储库-https: //help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
当然,这将删除所有提交历史分支,以及来自github存储库和本地git存储库的问题。 如果这是不可接受的,则必须使用其他方法。
将此称为核选项。
#4楼
如果您推送到GitHub,则强行推送还不够,请删除存储库或联系支持部门
即使您随后强行按下一秒钟,也不足以按以下说明进行操作。
唯一有效的措施是:
什么泄露了诸如密码之类的可更改凭证?
- 是的:立即修改您的密码,并考虑使用更多的OAuth和API密钥!
否(裸照):
您是否关心存储库中的所有问题是否都受到影响?
- 否:删除存储库
是:
- 联系支持
- 如果泄漏对您来说非常关键,以至于您愿意让某些存储库停机以减少泄漏的可能性,请在等待GitHub支持答复时将其设置为私有
强行推一秒钟还不够,因为:
GitHub长时间保持悬空提交。
但是,如果您与GitHub工作人员联系,则可以删除此类悬空的提交。
当我将所有GitHub提交电子邮件上载到一个回购中时,我亲身经历了这件事,他们要求我将其删除,所以我做到了,他们做了
gc
。 但是,必须删除包含数据的提取请求:因此,回购数据在首次删除后长达一年仍可访问。悬挂的提交可以通过以下两种方式看到:
- 提交Web UI: https : //github.com/cirosantilli/test-dangling/commit/53df36c09f092bbb59f2faa34eba15cd89ef8e83 ( Wayback machine )
- API: https : //api.github.com/repos/cirosantilli/test-dangling/commits/53df36c09f092bbb59f2faa34eba15cd89ef8e83 ( Wayback machine )
然后,获取该提交源的一种便捷方法是使用zip下载方法,该方法可以接受任何引用,例如: https : //github.com/cirosantilli/myrepo/archive/SHA.zip
可以通过以下方式获取丢失的SHA:
- 列出
type": "PushEvent"
API事件。例如: httpstype": "PushEvent"
( Wayback machine ) - 有时,通过查看尝试删除内容的拉取请求的SHA可以更加方便
- 列出
有一些诸如http://ghtorrent.org/和https://www.githubarchive.org/之类的爬虫 ,它们会定期汇总GitHub数据并将其存储在其他位置。
我找不到他们是否抓取了实际的提交差异,这不太可能,因为会有太多的数据,但是从技术上讲是可能的,而且NSA和朋友可能拥有过滤器,仅将与人或感兴趣的提交相关的内容存档。
如果您删除存储库而不是仅仅强制推送,即使提交也会立即从API中消失并给出404,例如https://api.github.com/repos/cirosantilli/test-dangling-delete/commits/8c08448b5fbf0f891696819f3b2b2d653f7a3824即使您重新创建另一个具有相同名称的存储库。
为了测试这一点,我创建了一个仓库: https : //github.com/cirosantilli/test-dangling并做到了:
git init
git remote add origin git@github.com:cirosantilli/test-dangling.git
touch a
git add .
git commit -m 0
git push
touch b
git add .
git commit -m 1
git push
touch c
git rm b
git add .
git commit --amend --no-edit
git push -f
另请参阅: 如何从GitHub删除悬空的提交?
#5楼
这是我在Windows中的解决方案
git filter-branch --tree-filter“ rm -f'filedir / filename'”头
git push --force
确保路径正确,否则将不起作用
希望对您有所帮助
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3192661