git-svn 的钩子
Posted
技术标签:
【中文标题】git-svn 的钩子【英文标题】:Hooks for git-svn 【发布时间】:2011-01-02 03:12:40 【问题描述】:我可以设置挂钩以从/向git-svn
托管存储库“拉”/“推”吗?
情况是我在Google Code上有一个项目宿主,使用git管理本地工作副本。我想设置一些钩子,以便在使用git svn fetch
和git svn dcommit
从/向SVN 存储库签入/签出数据时,我可以对提交进行一些修改。由于我不托管 SVN 存储库,因此无法在服务器端设置挂钩。
有什么钩子可以用吗?或者有没有办法“标记”一个普通的分支,以便该分支上的 git pull
和 git 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 的钩子的主要内容,如果未能解决你的问题,请参考以下文章