2

我有一个 git 存储库,其中包含大约 30 个修订版,我想将其导入现有的 SVN 存储库。不幸的是,SVN 存储库有一堆预提交挂钩,需要提交消息中的某些信息、某些文件类型中的某些 SVN 关键字等等。这些都与我正在检查的内容无关,或者无论如何,它们不如保留现有的修订历史重要。

在一个完美的世界里,我也许可以做这样的事情:

  1. 劫持第一个 git 修订版(以及任何其他引入新文件的修订版),使其包含必要的 SVN 关键字并设置相应的 svn:keywords 属性
  2. 批量编辑所有 30 条 git 提交消息以添加所需的提交消息字符串

在一个不太完美的世界里,我可以让 git-svn 以某种方式预先添加 skip-pre-commit-checks (? - 我以前从未使用过它),然后我至少会在那里拥有所有的修订历史.

想法?


更新添加: skip-pre-commit-checks 实际上不是一件事;我被特定项目中的特定黑客误导了。

4

1 回答 1

5

你有几个选择。

批量重写提交消息

你可以使用git filter branch来重写你的提交信息:

如果您需要将 Acked-by 行添加到最后 10 次提交(都不是合并),请使用以下命令:

git filter-branch --msg-filter '
    cat &&
    echo "Acked-by: Bugs Bunny <bunny@bugzilla.org>"
' HEAD~10..HEAD

手动编辑 30 条提交消息

您可以通过选择编辑模式git rebase interactive来重写您的提交消息

git rebase -i HEAD~30

edit f7f3f6d changed my name a bit
edit 310154e updated README formatting and added blame
edit a5f4a0d added cat-file
...

然后

git commit -v --amend
<editor launched, edit commit message>
git rebase --continue
git commit -v --amend
<editor launched, edit commit message>
git rebase --continue
git commit -v --amend
<editor launched, edit commit message>
git rebase --continue
....

将所有内容压缩为一次提交

您还可以使用 git rebase 将所有内容压缩到一个提交中,从而限制您的工作量

git rebase -i HEAD~30

pick f7f3f6d changed my name a bit
squash 310154e updated README formatting and added blame
squash a5f4a0d added cat-file
...

<editor launched, edit the combined commit message>

主动自动化

如果这是您可能需要定期执行的操作,您可以使用prepare commit mesg挂钩为您的提交消息的格式添加一些一致性。

请注意,与 git 不同,您不能跳过 svn 中的预提交钩子(至少不能通过任何内置机制),因此尝试执行类似的操作git commit -va --no-verify将无效,因为下次运行时git svn dcommit,它将失败所有相同(当然,如果有什么事情要失败的话)。

于 2012-05-30T22:40:50.713 回答