0

我通常如何进行:

实际上,要从完整的历史记录中删除一些文件,我使用以下脚本(我称之为 git-crunch):

#!/bin/bash
#
# git crunch <filenames>
#
git filter-branch --index-filter "git rm --cached --ignore-unmatch $*"
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git fsck --full --unreachable
git repack -A -d
git gc --aggressive --prune=now

它可以完美地从(完整的)历史记录中删除指定的文件。

上下文是:

我有 1 个项目分为 4 个分支。这是一个摘要网络图,显示了 4 个维护分支中的 2 个:

┏ a937fd9 (1 year, 9 months ago) <new repo>
...
60 commits later, we create a branch "probe" which is displayed at left of the network
...
┣━┓
┣ ┃ c483a22 (8 months ago)
┃ ┣ f7b402c (3 months ago)
...
┃ ┣━┓
┣ ┃ ┃ 38bb93d (11 days ago)
┣ ┃ ┃ 1ef8202 (11 days ago)
┃ ┃ ┣━[remotes/origin/S...H_adjust]──adb243f (8 days ago)
┃ ┣ ┃ cd02775 (8 days ago)
┃ ┣━┛
┃ ┣ f9e40a3 (8 days ago)
┃ ┣ a30eb6f (7 days ago)
┃ ┣━[remotes/origin/S...H_verif]──4a3fe66 (7 days ago)
┃ ┗━[remotes/origin/HEAD]──[remotes/origin/master]──b452f85 (7 days ago)
┣ 91477ae (4 days ago)
┗━[HEAD]──[probe]──[remotes/origin/probe]──366c890 (48 minutes ago)

我的问题是:

我在这个存储库中有 3 个大文件,可以从一开始就删除(存储库的创建),但如果我使用我的脚本,它只会在一个分支中运行,它会从头开始重新创建 4 个单独的分支,直到最后一次提交,今天发生的事情。

我的问题:

如何在不从一开始就分离我的分支的情况下从我的整个历史记录中删除这 3 个文件?或者,有没有办法一次重写整个历史记录并从所有分支中删除文件,这样我就可以保持我的进化网络和“共享”提交完整(所以我的 61 个第一次提交不会重复四次)?

4

1 回答 1

1

执行此操作的最佳工具实际上是BFG Repo Cleaner,它是git filter-branch. 例如:

$ bfg --strip-blobs-bigger-than 10M

...删除所有大于 10MB 的 blob(不在您的最新提交中),并适用于您的 repo 中的所有分支和标签。

全面披露:我是 BFG Repo-Cleaner 的作者。

于 2014-09-30T17:26:09.470 回答