git-svn和不幸的svn pre-commit钩子

时间:2012-05-30 18:13:32

标签: git svn git-svn

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

在一个完美的世界里,我可能会做类似的事情:

  1. 劫持第一个git修订版(以及引入新文件的任何其他修订版),使其包含必要的SVN关键字并设置相应的svn:keywords属性
  2. 批量编辑所有30个git提交消息,以预先添加所需的提交消息字符串
  3. 在一个不那么完美的世界里,我可以得到git-svn以某种方式预先设置skip-pre-commit-checks(? - 我之前从未使用过它),然后我至少会进行所有的修改在那里的历史。

    思想?


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

1 个答案:

答案 0 :(得分: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将everthying转换为一个限制工作负载的提交

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,它会一直失败(如果有什么东西要失败的话)。