所以,有人将一个大文件推送到我们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之间做出选择,那么我会固定回购协议的大小。
1条答案
按热度按时间4sup72z81#
我们已经通过按以下顺序运行git-filter-repo修复了这个问题:
1.存储库的全新克隆
git clone <url_to_the_repo>
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
在这个坏文件从历史记录中删除并且仓库大小减小之后,提交哈希值也在那个分支上发生了变化。
最好在执行此操作之前创建服务器的快照