0

我已经使用git 有效地重写(rebase -i)很多历史来替换Git 存储库的整个提交历史的文件文本(Copyright <author>to )。Copyright <company>它可以工作,但的提交历史仍然可见

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

在 <code>git filter-branch</code> 命令之后

4

3 回答 3

1

所以那个 GUI 是来自 Atlassian 的 SourceTree。这是正确的。问题是我有其他分支和标签引用“旧历史”。所以很自然地,它会一直存在!

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

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

布朗博士:显然时间连续体被打乱了,创造了一个新的时间事件序列,导致了这个交替的现实。

马蒂:英语,医生!

布朗医生:这里。在这里,让我演示一下。假设这条线代表时间。[画直线并指向地点]这里是现在的 1985 年,未来和过去。显然,在过去的某个地方,时间线向下倾斜到这个切线(分支)[画新线并写 1985A] 创建另一个 1985(主)。替代你、我和爱因斯坦,但其他所有人都是现实。认识这个?[显示 Blast from the Past bag (tag)] 这是体育书籍进来的那个包;我知道是因为收据(标签)还在里面。我在时间机器里找到了它们……还有这个!(更多标签)

耶!Git 是 BTTF!

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

于 2013-03-11T19:33:11.700 回答
1

我建议使用BFG Repo-Cleaner,这是一种更简单、更快的替代方案,git-filter-branch专门用于从 Git 历史中重写文件。它使您的生活更轻松的一种方法是它实际上默认处理所有引用(所有标签、分支等),但它的速度也快了10 到 50 倍

您应该在这里仔细按照以下步骤操作:http ://rtyley.github.com/bfg-repo-cleaner/#usage - 但核心位是这样的:下载BFG 的 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)都将执行替换:任何匹配的字符串(不在您最近的提交中)都将被替换。

于 2013-03-31T10:20:39.860 回答
0

你不能重写 git 历史。这不是权威的事情,没有人拒绝执行它,这是根本无法做到的事情。提交 ID 是该特定提交的唯一名称。任何不同的提交,由于其内容或历史或描述中的任何更改,都具有不同的 id。您的“主”标签(分支只是 git 用作隐式父级并在您git checkout提交新内容时更新的标签)现在指的是您使用 rebase 创建的新历史(编辑:错误,更可能使用 filter-branch这里)。您的“svn/trunk”标签仍然指的是原始历史记录。如果你想在你的 repo 中忘记 svn/trunk git branch -d svn/trunk,.

于 2013-03-11T17:27:00.497 回答