我进口集市仓库到Git的方法(使用git bzr
),但由此产生的库包含虚假承诺父链接:
注意,提交标记1.02-6
是基于离1.02-3
提交,但1.02-1
被不必要地也标记为母体。 (注:在回购的这部分所有提交的标签;还有所示的那些之间没有提交。)
我试图以多种方式重定基(在master
分支: git rebase 1.02-3
, git rebase -i upstream-1.02
, git rebase --onto 1.02-1 1.02-3
, git rebase --root upstream-1.02 --onto=other_branch
),但在每种情况下,失败的合并冲突。 这些似乎试图比是必要的多; 历史上,除了一个额外的父指针正确记录在提交标记1.02-6
。
你如何删除,以线性的历史联系? 难道还有比手工精挑细选的所有提交顺序更好的办法?
最简单的方法来做到这一点(在混帐> = 1.6.5)是使用:
git replace --edit <sha>
和删除/添加/更改父:行。
一旦你高兴的改变是正确的,你可以修改的提交,使更改永久有效:
git filter-branch --tag-name-filter cat -- <parent sha>..head
你可以把它使用手动做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
。 我还没有试过。
这会纠正父母在不改变任何东西(如提交者的日期。):
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
并准备等待。
当然,如果其他人从要修改的事件后,任何提交支不使用这个或任何其他解决方案。 他们会恨你。
你可以尝试重订 。 有一个例子有点下来(搜索--onto),我认为这是类似于你的情况。
我认为你需要做的
git rebase --onto 1.02-1 1.02-3
1.02-3之后,应该把一切都在1.02-1那可能是你想要的东西。
请记住,哈希将在一切不同于第一改变提交,但我认为你这样做是在从BZR移动的第一步所以没有其他人应该还没有克隆这一点。