删除虚假承诺父指针(Remove spurious commit parent pointer)

2019-07-18 00:49发布

我进口集市仓库到Git的方法(使用git bzr ),但由此产生的库包含虚假承诺父链接:

注意,提交标记1.02-6是基于离1.02-3提交,但1.02-1被不必要地也标记为母体。 (注:在回购的这部分所有提交的标签;还有所示的那些之间没有提交。)

我试图以多种方式重定基(在master分支: git rebase 1.02-3git rebase -i upstream-1.02git rebase --onto 1.02-1 1.02-3git rebase --root upstream-1.02 --onto=other_branch ),但在每种情况下,失败的合并冲突。 这些似乎试图比是必要的多; 历史上,除了一个额外的父指针正确记录在提交标记1.02-6

你如何删除,以线性的历史联系? 难道还有比手工精挑细选的所有提交顺序更好的办法?

Answer 1:

最简单的方法来做到这一点(在混帐> = 1.6.5)是使用:

git replace --edit <sha>

和删除/添加/更改父:行。

一旦你高兴的改变是正确的,你可以修改的提交,使更改永久有效:

git filter-branch --tag-name-filter cat -- <parent sha>..head


Answer 2:

你可以把它使用手动做git commit-tree内部命令。

我们要编辑的提交标记1.02-6去除伪父指针(至56a2f3b5948ab54c9239c2b384a6ea9eb1f410c4 )。

首先,阅读从现有的提交对象的信息:

user@host:/path/repo.git$ git cat-file -p 1.02-6 
tree c658aa1ebcf2bf2a607696c7868b875be72fb01f
parent 56a2f3b5948ab54c9239c2b384a6ea9eb1f410c4
parent 4e671bf1d2298729c9e5cfd8229051cfe2c40831
author James Damour (Suvarov454) <suvarov454@users.sourceforge.net> 1146319620 -0400
committer Bazaar Package Importer <james.westby@ubuntu.com> 1146319620 -0400

The "main/" in the Section line of debian/control should be assumed.

提取使用的提交信息git log --format=%B -n 1 1.02-6

现在,创建具有相同的内容(不包括假父链接,并提交者信息)的新承诺:

git log --format=%B -n 1 1.02-6 | \
    GIT_AUTHOR_NAME="James Damour (Suvarov454)" \
    GIT_AUTHOR_EMAIL="suvarov454@users.sourceforge.net" \
    GIT_AUTHOR_DATE="1146319620 -0400" \
    git commit-tree c658aa1ebcf2bf2a607696c7868b875be72fb01f \
        -p 4e671bf1d2298729c9e5cfd8229051cfe2c40831

这创造了一个新的提交,并打印其散列( cc32e66 ...)。 现在把它变成一个新的分支:

git checkout -b fixed_commit cc32e66

和重订master到新的分支:

git checkout master
git rebase fixed_commit

我们就大功告成了:

你可能想删除旧的分支和重新标记相应的提交。


实际上,它可能是更容易使用git filter-branch --parent-filter 。 我还没有试过。



Answer 3:

这会纠正父母在不改变任何东西(如提交者的日期。):

git filter-branch --tag-name-filter cat --parent-filter 'test $GIT_COMMIT = [sha of 1.02-6] && echo "-p [sha of 1.02-3]" || cat' -- 1.02-1..master

你将有相应的承诺ID来替换括号中的文字。 如果您有需要重写更下游的分支,改变1.02-1..master--all并准备等待。

当然,如果其他人从要修改的事件后,任何提交支不使用这个或任何其他解决方案。 他们会恨你。



Answer 4:

你可以尝试重订 。 有一个例子有点下来(搜索--onto),我认为这是类似于你的情况。

认为你需要做的

git rebase --onto 1.02-1 1.02-3

1.02-3之后,应该把一切都在1.02-1那可能是你想要的东西。

请记住,哈希将在一切不同于第一改变提交,但我认为你这样做是在从BZR移动的第一步所以没有其他人应该还没有克隆这一点。



文章来源: Remove spurious commit parent pointer