git 如何从Bitbucket服务器就地存储库的历史记录中删除大文件

bxjv4tth  于 2023-03-11  发布在  Git
关注(0)|答案(1)|浏览(196)

所以,有人将一个大文件推送到我们Bitbucket中的一个repo(我们使用Bitbucket Server,所以它由我们托管)。我们已经删除了该文件,但也希望在历史中删除,因为repo现在相当大,无法克隆。
我们可以看到如何删除repo克隆中的大文件,我们已经使用git-filter-repo完成了这一操作。
然而,这个repo是CI系统的核心,我们不能轻易地移动或重命名它。因此,我想直接在bitbucket服务器使用的repo上执行相同的操作。这被证明是棘手的。我找到了repo的位置(多亏了this answer)。我登录到服务器并转到$BITBUCKET_HOME/shared/data/repositories/<id>,尝试在那里运行git-filter-repo命令,但失败了

Parsed 2203 commits
Required environment variable STASH_HOOK_ADDRESS is missing
Required environment variable STASH_HOOK_ADDRESS is missing
fatal: ref updates aborted by hook
fast-import: dumping crash report to fast_import_crash_22581
Error: fast-import failed; see above.

我找不到任何有关此错误的信息。有人能帮忙吗?
我停止了bitbucket服务并再次尝试。相同的响应。我启动了bitbucket,但它不会启动。然而,由于所有内容都是虚拟的,而且我们先拍了一张快照,所以我们可以回滚而不会造成任何伤害。但它仍然留下了如何在服务器上运行git-filter-repo(或以其他方式清理历史记录)的原始问题。
有一个替代方案。我可以,我想:

  • 创建镜像克隆
  • 使用git-filter-repo删除该文件
  • 删除Bitbucket服务器上的存储库
  • 在服务器上创建一个同名的新空
  • 从清理后的副本推送到服务器

这将清除存储库大小(这是我主要关心的--考虑到我们的CI流程如此多地克隆这个repo,让它非常臃肿将是一个问题),而且我有我所能看到的历史记录、分支和标记。我丢失的是拉取请求的设置和历史记录,等,我想保留这些,如果我可以-这是非常有用的,能够去一个问题,在Jira和点击链接,甚至关闭公关,看看从差异到底是什么做了。但是如果我必须在固定回购协议的大小和保留旧的PR之间做出选择,那么我会固定回购协议的大小。

4sup72z8

4sup72z81#

我们已经通过按以下顺序运行git-filter-repo修复了这个问题:
1.存储库的全新克隆
git clone <url_to_the_repo>

  1. checkout 带有错误文件的分支
    git checkout feature/bad_file
    1.在该分支上运行git-filter-repo。我们必须使用**--force**标志运行它。git-filter-repo脚本应该在您的仓库文件夹之外
    python3 ../git-filter-repo --invert-paths --path-match files/bad_file.zip --force
    1.将原点设置回git config,因为它已被脚本删除
    git remote add origin <url_to_the_repo>
    1.强制推送到分支
    git push --set-upstream origin feature/bad_file --force
    在这个坏文件从历史记录中删除并且仓库大小减小之后,提交哈希值也在那个分支上发生了变化。
    最好在执行此操作之前创建服务器的快照

相关问题