git-svn 的钩子

Posted

技术标签:

【中文标题】git-svn 的钩子【英文标题】:Hooks for git-svn 【发布时间】:2011-01-02 03:12:40 【问题描述】:

我可以设置挂钩以从/向git-svn 托管存储库“拉”/“推”吗?

情况是我在Google Code上有一个项目宿主,使用git管理本地工作副本。我想设置一些钩子,以便在使用git svn fetchgit svn dcommit 从/向SVN 存储库签入/签出数据时,我可以对提交进行一些修改。由于我不托​​管 SVN 存储库,因此无法在服务器端设置挂钩。

有什么钩子可以用吗?或者有没有办法“标记”一个普通的分支,以便该分支上的 git pullgit push 将签入/签出/签入/签出 SVN 存储库,因此可以使用普通的 git 钩子?

提前致谢。

【问题讨论】:

【参考方案1】:

https://github.com/hkjels/.dotfiles/blob/master/zsh/git-svn.zsh

如果你使用zsh,我相信这是git-svn的好伴侣。只需将你的钩子放在 .git/hooks 中,并在命令前加上 svn-。

例如“.git/hooks/post-svn-rebase”

该脚本还允许使用别名

【讨论】:

有人在这里基于这个 zsh 脚本制作了这个 bash 版本:github.com/rkitover/git-svn-hooks【参考方案2】:

如 this thread 所示,您可以在 Subversion 端设置挂钩,根据某些标准实际上可以拒绝您的 git svn dcommit

但如果您需要在 Git 端使用 git 挂钩,我建议您设置一个中间 bare Git repository(裸露以便于推/拉)。 在那个裸仓库上,你可以有任何你需要的钩子,如“how do I deploy multiple branches to different directories via git push?”所示(不是关于 svn,而是在这里详细说明额外仓库的类似设置)

如果中间仓库验证了你的推送,它可能会触发git svn dcommit。 它还可以根据git fetch 请求触发git svn fetch 并对其进行验证,然后再允许您自己的git fetch 继续前进。

(2 年后)

David Souther 在his blog(2012 年 4 月)中提出了解决方案

我的解决方案是拥有一个带有拆分头的存储库。大多数时候,中间存储库会有一个空的工作目录。当推送发生时,它会检查 master,验证构建,然后推送到 svn,然后返回空分支。

我们将建立一个包含两个分支的中间 git 存储库。

master 仍将指向 SVN 存储库,
新的分支stage 将让我们保持工作目录干净并与下游更改保持同步。

查看his gist。

【讨论】:

太棒了!中间存储库将解决我的问题。但我想把这个问题保持几天,看看是否有更优雅的解决方案:) @lamamac:绝对。这就是赏金的意义;) “它还可以在 git fetch 请求中触发 git svn fetch 并验证它” - 你会为此使用哪个钩子 - 我在 githooks 中看不到任何会被触发的明显内容当客户端尝试拉取时在服务器上。 @Greg: true,但是由于您要设置本地存储库和裸存储库(可以直接访问它),您可以直接调用 svn fetch 的裸存储库验证程序(您可以通过别名封装这两个操作)。但是在推送方面,您不必直接调用任何东西,裸仓库上的 post-receive 挂钩可以处理 svn dcommit。在任何情况下,中间裸存储库都允许您将纯版本控制方面(您的本地 Git 存储库)与 SVN 同步(Google SVN 存储库)分离。 @Daniel:任何需要工作树(即非裸仓库)的操作都必须在第二个中间仓库中执行,就在裸仓库旁边。裸仓库供您推送,但同样的裸仓库又会通过钩子转到(cd)第二个中间(非裸)仓库并触发git pull,然后会(仍然来自第二个非裸回购)做git svn dcommmit【参考方案3】:

有一个 git-remote-cvs remote helper 在工作中;大概有人会对svn做同样的事情。应该在调用这些助手之前和之后调用远程操作的普通钩子。

【讨论】:

以上是关于git-svn 的钩子的主要内容,如果未能解决你的问题,请参考以下文章

什么是钩子函数?钩子函数的使用。

键盘钩子怎么 使用

对钩子的理解

DELPHI中的钩子是啥?

git自定义项目钩子和全局钩子

路由的钩子函数