重写Git repo历史记录后,旧的提交历史记录仍然可见

时间:2013-03-11 17:06:37

标签: git git-rebase git-filter-branch git-rewrite-history

我已使用efficiently rewriting (rebase -i) a lot of history with git将文件文本(Copyright <author>替换为Copyright <company>)以获取Git存储库的整个提交历史记录。它有效,但提交历史仍然可见

在下面的屏幕截图中,蓝色分支中的“新”历史记录位于紫色分支中不需要的“旧”历史记录之后。我如何摆脱“旧”的历史? (为什么它没有'合并'成一个连续的历史打败我!

after <code>git filter-branch</code> command

3 个答案:

答案 0 :(得分:1)

因此,GUI是SourceTree,Atlassian。这是正确的。问题是我有其他分支和标签引用“旧历史”。很自然地,它坚持下去!

从回到未来的角度思考:)

所以,“你不能改写历史”是部分正确的,它只取决于你的观点。

布朗博士:显然,时间连续体已被中断,创建了一个新的时间事件序列,从而产生了这种替代现实。

Marty:英文,Doc!

布朗博士:在这里。在这里,让我来说明一下。让我们说这条线代表时间。 [绘制直线并指向地方]这是现在的1985年,未来和过去。显然,在过去的某个地方,时间轴倾斜到这个切线(分支)[绘制新线并写入1985A]创建一个替代1985(主)。替代你,我和爱因斯坦,但对其他人来说都是现实。认识到这一点? [显示过去的爆炸袋(标签)]这是体育书籍的包包;我知道因为收据(标签)还在里面。我在时间机器中发现了它们......随之而来! (更多标签)

耶! Git是BTTF!

道德:删除引用,它将不复存在!

答案 1 :(得分:0)

您无法重写git历史记录。这不是一个权威的东西,没有人拒绝实施它,这是根本无法完成的事情。提交标识是该特定提交的唯一名称。由于其内容或其历史记录或描述中的任何位置的任何更改,任何不同的提交都具有不同的ID。你的'master'标签(一个分支只是一个git用作隐式父级的标签,当你git checkout更新它并提交一些新内容时)现在引用你用rebase创建的新历史(编辑:错误,更多可能在这里使用filter-branch)。你的'svn / trunk'标签仍然是指原始历史记录。如果你想忘记你的仓库中的svn / trunk,git branch -d svn/trunk

答案 2 :(得分:0)

我建议使用BFG Repo-Cleaner,这是git-filter-branch的一种更简单,更快的替代方案,专门用于重写Git历史记录中的文件。它让你的生活更轻松的一种方式是,它实际上默认处理所有引用(所有标记,分支等),但它也更快10 - 50x

您应该在这里仔细按照以下步骤操作:http://rtyley.github.com/bfg-repo-cleaner/#usage - 但核心位是这样的:下载BFG's jar(需要Java 6或更高版本)并运行此命令:

$ java -jar bfg.jar  --replace-text replacements.txt  my-repo.git

replacements.txt文件应包含您要执行的所有替换,格式如下(每行一个条目 - 请注意不应包含注释):

pa$$word   # Replace literal string 'pa$$word' - with '***REMOVED***' by default
Copyright Volte==>Copyright MegaCorp     # Replace, specifiying replacement text
regex:Copyright \w+==>Copyright MegaCorp                # Replace, using a regex
regex:Copyright (\d{4}) \w+==>Copyright $1 MegaCorp     # Replace with reference

将扫描整个存储库历史记录,并且任何非二进制文件(大小不超过1MB)都将执行替换:任何匹配的字符串(不在最新提交中)将被替换。

相关问题