BFG Repo-Cleaner - 快速清除Git提交历史中的特定文件

BFG Repo-Cleaner(快速清除Git提交历史中的特定文件)

有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须更新或下载这些无用的文件,因此, 我们需要一个方法, 永久的删除这些文件(包括该文件的历史记录).

BFG是用Scala写的,像git-filter-branch那样删除大的或麻烦的块,但是速度更快。

在GitHub上查看项目

$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git

git-filter-branch的另一种选择

BFG是git-filter-branch之外的一种更简单、更快的方法,可以清除Git存储库历史中的不良数据:

  • 删除 大文件
  • 删除 密码凭证 和其他 私人数据

git-filter-branch命令非常强大,可以做BFG不能做的事情——但是BFG更适合上面的任务,因为:

  • : 快10 - 720倍
  • 简单 : BFG并不是特别聪明,但专注于让上述任务变得简单
  • 优美 : 如果需要,可以使用漂亮的Scala语言定制BFG。这至少在某些时候比Bash脚本要好。

使用

首先使用--mirror标志克隆一个新的repo副本:

$ git clone --mirror git://example.com/some-big-repo.git

这是一个 bare 仓库,这意味着您的普通文件将不可见,但它是存储库Git数据库的完整副本,此时您应该备份它,以确保不会丢失任何东西。

现在你可以运行BFG来清理你的仓库:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git

BFG将更新您的提交以及所有分支和标记,使它们保持干净,但它不会物理删除不需要的东西。 检查存储库以确保您的历史记录已更新,然后使用标准的git gc命令去除不需要的脏数据, git现在将这些脏数据视为多余的需求:

$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

最后,一旦您对您的仓库的更新状态感到满意,请把它重新推回去 (请注意,因为您的clone命令使用了--mirror标志,所以此推送将更新远程服务器上的所有引用):

$ git push

此时,您已经准备好让每个人都抛弃旧的repo副本,重新克隆新的原始数据。最好删除所有旧的克隆,因为它们会有肮脏的历史,您不想冒险将其推回到您新清理的repo中。

例子

在所有这些示例中,bfgjava -jar bfg.jar的别名。

删除所有名为'id_rsa'或'id_dsa'的文件:

$ bfg --delete-files id_{dsa,rsa}  my-repo.git

删除所有大于50兆字节的blob:

$ bfg --strip-blobs-bigger-than 50M  my-repo.git

将文件*(前缀行'regex:'或'glob:'如果需要)*中列出的所有密码替换为' *** remove *** ',无论它们在您的存储库中的任何地方:

$ bfg --replace-text passwords.txt  my-repo.git

删除Git中所有名为'.git'的文件夹或文件—保留的文件名。当从Mercurial等其他源代码控制系统迁移到Git时,这些常常会成为一个问题:

$ bfg --delete-folders .git --delete-files .git  --no-blob-protection  my-repo.git

对于进一步的命令行选项,您可以不带任何参数运行BFG,它将输出如下所示

你的当前文件是神圣的...

BFG对待你就像一个改过自新的酒鬼:你过去犯过一些错误,但现在你已经改过自新了。因此,BFG假定您的最新提交是一个好的提交,其中没有您希望从历史记录中删除的脏文件。BFG的这一假设保护了您的工作,并让您安心地知道BFG只是仅仅更改您的仓库历史记录,而不是干预项目的当前文件。

默认情况下,HEAD分支是受保护的,虽然它的历史记录将被清除,但是最新的提交(这个'技巧')是protected commit(受保护的提交),它的文件层次结构将不会被改变。

如果你想保护几个分支或标签的tips(提示)(不只是HEAD'头部'),只需为BFG命名:

$ bfg --strip-biggest-blobs 100 --protect-blobs-from master,maint,next repo.git

注意:

  • 清理Git repos就是要彻底根除历史上的坏东西。如果某个坏的文件(比如10MB的文件,当您指定--strip-blobs-bigger-than 5M)在受保护的提交中,那么它不会被删除—它将保存在您的存储库中,即使BFG从以前的提交中删除了它。如果你想让BFG删除一些东西,你需要确保你的当前提交是干净的
  • 请注意,尽管这些受保护的提交中的文件不会被更改,但是当这些提交从早期的脏提交继续进行时,它们的提交ids 更改,以反映更改的历史—只有文件系统树的SHA-1 id 将保持不变。

更快...

BFG 10 - 720xgit-filter-branch更快,将过夜作业提升到不到10分钟的作业。

要求

链接...

许可

BFG是自由软件:您可以根据自由软件基金会发布的GNU通用公共许可证、许可证的第3版或(根据您的选择)任何后续版本的条款重新分发和/或修改它。

BFG的发行是希望它将是有用的,但没有任何保证;甚至没有隐含的适销性或适合某一特定用途的保证。有关更多细节,请参阅GNU通用公共许可证。

转载于:https://my.oschina.net/wstone/blog/3033932

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`git reset --hard origin/master` 是 Git 的一个命令,用于将当前分支(通常是 HEAD)的指针直接指向远程仓库 `origin` 的 `master` 分支。这个操作是不可逆的,一旦执行,所有本地对远程 `master` 分支所做的更改都将被丢弃,工作目录和暂存区的内容都会恢复到最后一次从远程 `master` 拉取的状态。 如果你意识到这个操作可能会导致数据丢失,你应该尽快采取以下步骤尝试恢复: 1. **检查状态**: 在执行 `git reset --hard` 前,使用 `git status` 确认你的当前状态,这能帮助你确定哪些文件可能已经被重置。 2. **恢复未提交的更改**: 如果有未提交的更改,你可以在执行 `reset` 前先 `git add .` 将它们添加到暂存区,然后用 `git commit -m "Your commit message"` 记录下来。之后再做 `reset`,这些更改不会丢失。 3. **使用 `git reflog`**: 如果 `reset --hard` 已经执行,`git reflog` 可以帮你追踪HEAD的先前位置。查找最近的 `HEAD@{n}`,其 n 是时间点,然后使用 `git reset --hard HEAD@{n}` 尝试恢复。 4. **恢复未删除的文件**: 如果有被误删的文件,查看 `.git/refs/original/HEAD` 文件或使用 `git reflog` 找到对应的提交,然后从那个提交恢复文件。 5. **提交历史备份**: 如果你没有在执行 `reset --hard` 之前创建过提交,你可能需要重新创建提交历史,这会比较复杂,可能需要一些Git魔术或第三方工具(如BFG)来完成。 请注意,以上步骤仅适用于你知道自己想撤销的具体操作,因为大部分情况下,一旦数据被 `reset --hard` 重置,就很难完全恢复。因此,建议在执行敏感操作前做好充分的备份和确认。如果你不确定如何操作,最好是咨询更有经验的开发者或查阅Git官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值