git-svn 和不幸的 svn 预提交钩子(Hook)

标签 git svn git-svn

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

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

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

在一个不太完美的世界中,我可以让 git-svn 以某种方式预先添加跳过预提交检查(? - 我以前从未使用过它),然后我至少可以拥有所有修订里面有历史。

想法?


更新添加:跳过预提交检查实际上并不是一件事;我被某个特定项目的特定黑客行为误导了。

最佳答案

您有几个选择。

批量重写提交消息

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

If you need to add Acked-by lines to, say, the last 10 commits (none of which is a merge), use this command:

git filter-branch --msg-filter '
    cat &&
    echo "Acked-by: Bugs Bunny <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="82e0f7ececfbc2e0f7e5f8ebeeeee3acedf0e5" rel="noreferrer noopener nofollow">[email protected]</a>>"
' 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钩子(Hook)为提交消息的格式添加一些一致性。

请注意,与 git 不同,您无法跳过 svn 中的预提交 Hook (至少不能通过任何内置机制),因此尝试执行类似 git commit -va --no-verify 的操作下次运行 git svn dcommit 时不会有任何影响,它仍然会失败(当然,如果有什么失败的话)。

关于git-svn 和不幸的 svn 预提交钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10821920/

相关文章:

git - 如何在 git clone --reference 之后分离替代品?

git - "git reset"和 "git rebase"有什么区别?

svn - 如何仅还原SVN工作副本中的目录?

svn - 通过SSH的svn diff-结果与Trac不同吗?

windows - windows下git mingw32和长路径/文件名

git - 无法将文件夹 www 添加到 github 存储库

linux - 如何设置 Gitlab 钩子(Hook)来验证 git 推送到远程

svn - 将同一主干的分支合并到其中一个分支中

svn - 我可以将 GIT 存储库与 SVN 客户端一起使用吗?

git svn 获取特定目录