【发布时间】:2015-02-26 13:24:02
【问题描述】:
我正在准备一个 svn2git 迁移,虽然 https://github.com/nirvdrum/svn2git 非常有用,但我仍然遇到了一些恶作剧。我已经能够清理其中的大部分,但仍然有一个。我的历史是这样的:
A1 - B1 - C1 - E1 - F1
\
A2 - B2 - C2 - D1
A1-C1 和 A2-C2 相同,只是多了一个子目录级别。 A2-C2 确实是 svn 迁移和以前的git-filter-branch 操作的产物,我确定了这一点。
D1 是标记为release_2_0_4 的合并提交。
我想摆脱 A2-C2。我看到了两种方法:
- 取消标记 D1、标记 C1、reflog 过期和垃圾收集。噗! A2-C2 不见了。
- 我还可以重写 D1 的双亲,使其只有 C1 作为双亲,并带有一点
git-filter-branch的魔力。
我可以使用第一种方法,因为 C1 和 D1 的文件内容是相同的(用 git diff C1 release_2_0_4 检查),但是我会丢失提交日期、作者和消息。
第二种方法是:
git filter-branch --tag-name-filter cat --parent-filter 'test $GIT_COMMIT = [sha of release_2_0_4] && echo "-p [sha of FIRST parent of release_2_0_4]" || cat' -- --all
我已经用硬编码的 SHA 手动尝试过,它可以工作。但我需要在不知道 SHA 的情况下编写脚本。
我知道如何找到 D1 的父母,他们可以用插入符号引用:release_2_0_4^1 和 release_2_0_4^2(在这里找到:Get parents of a merge commit in git),但我不确定如何找出哪个是哪个。我在脚本中执行此操作,而不是以交互方式执行此操作,并且其他 git-filter-branch 操作可能会更改 SHA 哈希,因此我需要找到一种方法来确定我需要两个提交中的哪一个。我唯一的线索是 C1 有 2 个子提交,而 C2 只有一个子提交。
总而言之,我的问题是:
- 如何找到
[sha of FIRST parent of release_2_0_4]? - 如何在不与单引号、双引号、变量扩展等混淆的情况下将其放入 Bash 脚本中?
PS:我不需要担心上游,任何可能包含此代码的 git 存储库都不会被认为是官方的,直到我为 svn2git 迁移开了绿灯。
【问题讨论】:
标签: git git-svn git-filter-branch