我正在准备 svn2git 迁移,同时https://github.com/nirvdrum/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、引用日志过期和垃圾收集。噗! A2-C2 消失了。
- 我还可以重写 D1 的父母,这样它就只有 C1 作为父母,还有一些
git-filter-branch
magic.
I could使用第一种方法,因为 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
and release_2_0_4^2
(发现这里:获取 git 中合并提交的父级 https://stackoverflow.com/questions/9059335/get-parents-of-a-merge-commits-in-git),但我不确定如何找出哪个是哪个。我是在脚本中执行此操作,而不是以交互方式,以及其他方式git-filter-branch
操作可能会更改 SHA 哈希值,因此我需要找到一种方法来确定我需要两个提交中的哪一个。我唯一的线索是 C1 有 2 个子提交,而 C2 只有一个子提交。
总而言之,我的问题是:
- 我怎样才能找到
[sha of FIRST parent of release_2_0_4]
?
- 如何将其放入 Bash 脚本中而不与单引号、双引号、变量扩展等混淆?
PS:我不需要担心上游,可能包含此代码的 git 存储库都不会被认为是官方的,直到我为 svn2git 迁移开绿灯。