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

Dav*_*les 2 svn git git-svn

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

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

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

在一个不那么完美的世界里,我可以得到git-svn以某种方式预先设置skip-pre-commit-checks(? - 我之前从未使用过它),然后我至少拥有所有的修订历史记录.

思考?


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

AD7*_*six 5

你有几个选择.

批量重写提交消息

您可以使用git filter branch来重写您的提交消息:

如果您需要将Acked-by行添加到最后10个提交(其中没有一个是合并),请使用以下命令:

git filter-branch --msg-filter '
    cat &&
    echo "Acked-by: Bugs Bunny <bunny@bugzilla.org>"
' HEAD~10..HEAD
Run Code Online (Sandbox Code Playgroud)

手动编辑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
...
Run Code Online (Sandbox Code Playgroud)

然后

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
....
Run Code Online (Sandbox Code Playgroud)

将所有内容压缩成一个提交

您还可以使用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>
Run Code Online (Sandbox Code Playgroud)

主动自动化

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

请注意,与git不同,您不能跳过svn中的预提交挂钩(至少不能通过任何内置机制),因此尝试执行任何操作git commit -va --no-verify都不会影响下次运行时git svn dcommit,它将全部失败相同(如果有什么东西要失败的话).