【问题标题】:Find the right parent of a merge commit in a non-interactive way以非交互方式查找合并提交的正确父级
【发布时间】: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。我看到了两种方法:

  1. 取消标记 D1、标记 C1、reflog 过期和垃圾收集。噗! A2-C2 不见了。
  2. 我还可以重写 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^1release_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


    【解决方案1】:

    我发现没有可靠的方法来做到这一点,因为 git 将每个父母视为平等的,它只是按照它得到它们的任何顺序使用它们。

    所以我最终还是手动完成了,如上所述。

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 2012-05-05
      • 2015-12-25
      • 2019-09-23
      • 2021-08-28
      • 1970-01-01
      • 2019-04-28
      相关资源
      最近更新 更多