2014-09-30 86 views
0

如何我通常着手:的Git从历史删除文件,而不用复制预分支提交

实际上,删除一些文件,从完整的历史,我使用下面的脚本(我称之为混帐紧缩):

#!/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) 

我probolem是:

我在这个仓库3个大文件可能从一开始(锐被删除),但是如果我使用我的脚本,它只会在一个分支中运行,并且它会重新创建4个独立的分支,从最开始直到上次提交,这是今天发生的。

我的问题:

我如何能实现这3个文件去除frmo我的整个历史没有从一开始就分开了我的枝叶? 或者,有没有办法重写整个hisotry并一次从所有分支删除文件,所以我可以保持我的进化网络和“共享”提交完好(所以我不让我的61第一次提交重复四次)?

+0

Dupe - http://stackoverflow.com/questions/7430717/git-filter-branch-on-all-branches – 2014-09-30 17:07:54

回答

1

最好工具,这样做实际上是The BFG Repo Cleaner,更简单,更快速的替代git filter-branch。例如:

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

...删除超过10MB的所有斑点(不在你最新提交),并适用于所有分支标签&在你的回购协议。

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

+0

非常感谢,有它,但不确定它是否会重复或不是我为每个分支提交... – menssana 2014-09-30 18:31:35

+0

我想有一种方法可以指定文件名而不是大小? – menssana 2014-09-30 18:32:07

+1

一般来说,只需在您的回购副本上进行试用,看看会发生什么情况 - BFG足够快,以至于不会花费任何时间。 BFG运行在您的整个回购中,对于所有*分支 - 您不会再有任何更多的提交或分支。你可以指定文件名(虽然不是路径),如果你像('--delete-files') - 在你的情况下有3个大文件,我只会使用'--strip-blobs-greater-than'。 – 2014-09-30 21:10:38

相关问题