Git从历史记录中删除文件而不重复预分支提交

时间:2014-09-30 16:10:02

标签: git git-filter-branch git-history-graph

我通常如何继续:

实际上,要从完整历史记录中删除一些文件,我使用以下脚本(我称之为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

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

上下文是:

我有一个项目,分为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次首次提交重复四次)?

1 个答案:

答案 0 :(得分:1)

最佳工具实际上是 The BFG Repo Cleaner ,是git filter-branch的一种更简单,更快捷的替代方法。例如:

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

...删除所有大于10MB的blob(不在最新提交中),并且可以在所有分支&amp;你的回购中的标签。

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