SVN 挂钩不工作

2024-01-12

我有一个分支和主干的服务器存储库。分支是所有团队成员的存储库。我正在尝试使用svn hooks仅在我的分支下的仓库中,但它似乎工作得不好。以下是我尝试采取的步骤:

  1. 检查过了my_repo从远程服务器的branch/my_repo

  2. 自本地回购以来my_repo没有任何内容,我在本地创建了一个新的 svn 存储库并复制了所有内容,包括/hooks文件夹到my_repo.

  3. 我创建了一个空文件my_repo并添加了一行文字。然后svn add这个文件。

  4. 修改了my_repo/hooks/pre-commit.tmpl文件并使其始终无法通过,并显示错误代码 1。现在看起来像:



#!/bin/sh
exit 1
  
  1. 复制pre-commit.tmpl预提交并给自己添加预提交的执行权限

  2. 服务器包含其他人的现在服务器的结构是这样的:



- server
    - branch
        - my_repo
            - myfile
            - hooks
                - pre-commit
        - Tom's repo
        - other team member's repo
    - trunk
  
  1. 在签出的存储库中,我使用以下命令提交了更改:svn commit -m "dumb change"

现在从这里我不应该能够提交,它应该给我一个代码 1 的错误,对吧?但我在任何地方都没有看到它。

  1. 然后我尝试将 hooks 文件夹放在顶层并与分支和主干处于同一级别。即结构如下所示:


-server
    - branches
        - my_repo
            - myfile
        - Tom's repo
        - other team member's repo
    - trunk
    - hooks
        - pre-commit
  

但是,仍然不起作用。叹...

然而,在大卫的帮助下,我弄清楚了该怎么做以及哪里出了问题: 1. 强调一下:hooks 文件夹的所有权应该与存储库的创建者相同。因此我不得不要求所有者将钩子文件添加到服务器。我没有在服务器上创建存储库,因此这些文件在我的工作目录中不可见。 2.现在这是我尝试过的:



  1) on my own Linux system, I `svnadmin create` a new repository, maybe called test_server: in that there is folders: confs, db, hooks, locks; files: format, readme.txt
  2) on the same level, mkdir a new folder (called working_dir) as your local working directory and checkout from the test_server. Now the working_dir contains a folder called test_server and it's empty. You can't see any of the folders or files in step 1
  3) modify the test_server's hooks file as described above. 
  4) try to add a file and add a new line to the file in the working_dir/test_server folder and commit. 
  5) now you should see commit failed with message: svn: Commit blocked by pre-commit hook(exit code 1) with no output. 
  

非常感谢大卫和之前发表评论的人!


当您运行钩子时,STDOUT(通常由echo语句)被禁用。这意味着您的脚本无法使用 STDOUT 打印任何内容,即使它已被重定向到文件。

相反,您需要打开另一个文件描述符而不是使用1(标准输出)。您可以使用exec命令打开另一个文件描述符,然后将其通过管道传输到文件中:

exec 4> $my_file  #Opening my_file for writing
echo "This is going to $my_file" >&4

STDERR 也是重定向。 STDERR 的输出被收集并发回调用客户端,但前提是挂钩返回非零退出代码。这为您提供了一种与客户端沟通挂钩失败原因的方法。

您还必须小心,因为钩子运行的环境会被擦洗。甚至$PATH一片空白。

这些是为什么钩子脚本可以从命令行正常运行,但在作为钩子执行时却不能正常运行的一些原因。

如果您不相信某个钩子正在工作,只需对其进行设置,使其以非零退出代码退出。如果您从 Subversion 收到事务失败的消息,您就知道执行了挂钩脚本。

我还建议您至少使用svnserve充当 Subversion 服务器——即使您是唯一使用该存储库的人。我从不使用file://即使我是唯一使用该存储库的人。这svnserve该过程使用起来非常简单,而且相当轻量。

另外,切勿使用svn在钩子脚本中。使用svnlook反而。


Addendum

我想对此说得非常非常清楚。我们需要就一些定义达成一致:

  • SERVER 是运行 Subversion 存储库的计算机。你使用了命令svnadmin create foo创建一个foo将充当存储库本身的目录。
  • REPOSITORY DIRECTORY 是服务器上由svnadmin create命令。这是存储库的服务器端。你会not在这里查看您已签入 Subversion 的所有文件。相反,您会看到一个hooks目录和一个db目录。这是服务器用来跟踪其更改的内容。
  • 工作目录是你已经完成的目录svn checkout查看项目的特定修订版。
  • REPOSITORY 是您使用各种库时获得的 REPOSITORY DIRECTORY 的虚拟视图svn命令如svn ls or svn log or svn co。这不是存储库目录,而是存储库的视图。

好的,现在我们已经解决了:

Hook 脚本存储在 REPOSITORY DIRECTORY 下hooks目录。当您创建存储库目录时,已经有一个名为的子目录hooks以及一些钩子脚本的模板。这些将有一个*.tmpl后缀。要创建挂钩,您需要将这些脚本之一替换为您的挂钩脚本,然后将其删除*.tmpl后缀。挂钩脚本必须具有可执行权限,并且由运行 Subversion SERVER 进程的用户拥有。 (用户运行httpd or the svnserve服务器上的命令)。

挂钩适用于整个存储库。您不能告诉钩子仅在特定分支受到影响时才触发。但是,您的挂钩脚本可以查看文件所在的位置并据此采取操作。我有一个预提交钩子 https://github.com/qazwart/SVN-Precommit-Kitchen-Sink-Hook就是这么做的。它使用控制文件来根据文件的位置确定需要采取的操作。但是,每次提交发生时,即使不需要执行任何操作,该钩子也会触发。

我希望这回答了你的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVN 挂钩不工作 的相关文章

  • 重新创建 svn 存储库

    在一次重大服务器故障之后 svn 存储库被破坏 我的工作版本是最新版本 从我的工作版本重新创建 svn 存储库的方法是什么 在新服务器上安装 svn 并尝试我的工作副本之后 svn switch NEW SVN PATH 我收到一个错误 R
  • 在应用程序版本中使用 svn 修订号

    在 VS2010 解决方案 不是 NET 中 我希望将 svn 修订号作为应用程序版本的一部分包含在内 我们目前不使用 makefile 仅使用 VS 解决方案 项目设置 我想在编译时获取工作副本修订号 将其存储到变量中 以便稍后在代码中使
  • 在 SVN 存储库中导入 Android Studio 项目的正确方法是什么?

    我正在尝试在 SVN 存储库中导入 Android Studio 项目 我显然尝试过 VCS gt 导入到版本控制 gt 导入到 Subversion 但问题是 即使取消选中Include ignored resources框内 软件不断将
  • 有没有办法过滤掉 TortoiseSVN 日志中仅属性的更改?

    SVN 的 mergeinfo 功能确实很有用 但是当文件上的所有更改都是 svn 属性时 它会在修订日志中放置一个日志条目 而我们通常不希望看到这些 有没有办法过滤掉 TortoiseSVN 日志中仅属性的更改 拉起日志 选择您要比较的两
  • 在家庭和办公室进行开发,GIT 会比使用 xcopy 的 SVN 更容易吗?

    如果出于安全原因 源代码只能存储在我的家庭计算机和办公室计算机上 如果传输代码的唯一方法是 USB 密钥 那么哪种源代码控制是最好的 SVN还是GIT 注意 两台计算机之间没有网络连接 我推荐git 无论哪种方式 您都需要 USB 密钥上的
  • TortoiseSVN 不允许我添加任何文件

    我正在尝试使用 TortoiseSVN 1 8 1 将文件添加到 SVN 存储库 我右键单击这些文件并选择 TortoiseSVN gt Add 然后 我选择弹出窗口中的所有文件 然后单击 确定 单击 确定 后 会弹出另一个对话框 所有文件
  • 清理 Subversion 存储库的最佳方法是什么?

    我有一个不断增长的存储库 其中包含十几个我使用 TortoiseSVN 维护的项目 因为我对此完全陌生 还不知道其来龙去脉 我保存存储库的空间有限 因此我想备份它 然后删除一些旧版本 例如 如果一个项目的版本为 50 我只想保留 50 49
  • 低级键盘钩子不在 UI 线程上

    我想为键盘挂钩创建一个好的库 我使用 SetWindowsHookEx 方法 我注意到如果我的应用程序的主线程繁忙 则应在任何系统 KeyDown 事件中调用的方法 hookProc 不会执行 我认为钩子应该这样制作 以便另一个线程负责它
  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 有 SVN 基准吗?

    我们想要对本地 SVN 服务器进行一些性能优化 例如迁移到更好的服务器 添加 SSD 等 我可以使用一些基准来查看这些修改是否确实有助于性能 是的 有一个 由 CollabNet 发布 https ctf open collab net s
  • svn diff 如何仅显示更改的行

    当我使用 svn diff en lua 时 我得到以下结果 num Amount all All class Quality own Have own Have2 paper Specs piece Shard not enough no
  • 颠覆和混合修订:破坏构建的秘诀?

    在使用 TFS 一段时间后 我刚刚回到 subversion 一般来说我已经很退出了 有一件事情我记得不一样 我不记得能够从过时的工作副本中提交 或者也许我的记忆力让我无法理解 过时 的定义 我认为 过时 意味着自从我上次更新工作副本以来
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • svn 强制迁移

    我正在考虑将我们的 svn 代码库迁移到 perforce 看看谷歌搜索结果 我确实找到了两个具有相同功能的工具 P4转换ftp ftp perforce com pub perforce tools p4convert docs inde
  • 丢失了我在 GIT 中的提交。你会不小心删除提交吗?

    我正在使用 git gui 但看不到我的分支 我知道我今天检查了一些东西 在完成提交并使用分支查看器验证后 我更改为较早的分支 我对之前的分支进行了更改 然后想返回到当前的分支 但我再也看不到它了 任何帮助都会很棒 回答你的问题 在大多数情
  • 删除 woocommerce 店面主页标题 php

    我正在使用 woocommerce 的店面主题 我需要用 php 删除主页标题 h1 我知道 css 解决方案 但我不想使用它 因为我想将 h1 添加到该页面的其他位置 并且在一个页面中包含 2 个 h1 对 seo 不利页 我也知道删除页
  • TortoiseSVN 不要求身份验证?

    我已经在conf文件中设置了一个新的SVN存储库 运行SVNServe anon access none SVNServe 忠实地正确地做到了这一点 但是当我尝试使用 TortoiseSVN 浏览存储库时 它只是说不允许访问 它不应该要求我
  • SVN 外部未在 TortoiseSVN 的存储库浏览器中正确显示并在本地标记为非版本化

    I work on a work project that s scattered across a myriad of source projects and SVN locations To make life easier I fol
  • 忽略 Mercurial hook 中的某些 Mercurial 命令

    我有一个像这样的善变钩子 hooks pretxncommit myhook python path to file myhook 代码如下所示 def myhook ui repo kwargs do some stuff 但在我的例子中
  • 如何保持 Subversion 和远程服务器(通过 FTP)同步?

    我们很难保持 Subversion 和 FTP 同步 有时我们忘记提交更改并只是将它们推送到 Web 服务器 我们的 svn 文件夹分散在整个 Web 服务器中 有些东西存在于一个地方而不存在于另一个地方 等等 今天我想花点时间解决这个问题

随机推荐

  • 如何在 helm install 命令中使用 --set 覆盖多行字符串?

    我需要在部署时安装带有动态 project id 标志的 helmrawConfig多行字符串 Example values yaml sinks console type console inputs kafka rawConfig ta
  • 如何验证证书?

    我刚刚开始一个项目 需要使用 FTPS 连接到第三方服务器 他们将向我们提供他们的证书 我还没有 所以我将创建我们自己的开发环境来开始 我使用 Alex FTPS 客户端作为我的起点 http ftps codeplex com http
  • 如何在 Application Insights 中扩展对传出 http 请求的依赖项跟踪

    我有一个 NET core API 它执行与其他 API 的 HTTP 连接 我可以在 Application Insights 中的 依赖项事件类型 下可视化传出 HTTP 请求 但它只有基本信息 我正在研究如何添加有关传出 HTTP 调
  • 无法在 iOS 中打开/创建 SQLite 数据库

    我有 2 个文件 DatabaseViewController h 文件 其中有 import
  • 在 SciPy 中,什么是“线性”插值?

    我找不到解释在文档中 http docs scipy org doc scipy reference generated scipy interpolate interp1d html scipy interpolate interp1d或
  • 如何在启用双因素的情况下将包上传到 PyPi?

    我想将包上传到 Pypi 因此我创建了一个帐户并尝试按照手册进行操作 帐户 看起来我无法从中创建项目pypi org直接地 我安装了twine我做到了 python3 m twine上传dist 这次我出现了以下错误 HTTPError 4
  • HttpHeaders.TryAddWithoutValidation 的目的是什么?

    在System Net Http Headers命名空间中 有什么区别HttpHeaders TryAddWithoutValidation http msdn microsoft com en us library hh875107 as
  • 使用最后一个非空列值动态填充单元格

    如何获取要填充下一个空单元格的最后一个值 直到下一个值 如下所示链接到工作表 https docs google com spreadsheets d 1yRX0sfIK3geu0bY1L1vXBSDAV7xIfmQHtPA4 ZuH9GY
  • 如何根据时区将时刻转换为另一个时刻

    我在 JS 方面真的很糟糕 而且我在 moment js 上苦苦挣扎 我的愿望是 从 div UTC 获取日期并根据用户的时区转换该日期 因此 如果 UTC 日期是 30 03 2017 6 34 22 AM 纽约有人看到 30 03 20
  • 与 Jedis 客户端的事务发生 Redis 异常

    为了避免在我的 Redis 通道中出现重复 我通过在 Redis 集中保留索引来检查消息是否已经存在 以下是我的实现 然而 它给出了一个例外 redis clients jedis exceptions JedisDataException
  • CUDA 目标的 Numba 和 guvectorize:代码运行速度比预期慢

    值得注意的细节 大型数据集 1000 万 x 5 200 x 1000 万 x 5 主要是 Numpy 每次跑步后需要更长的时间 使用Spyder3 Windows 10 首先是尝试将 guvectorize 与以下函数一起使用 我传入一堆
  • spring中动态更新@value注解的字段

    我正在尝试动态更新 value我的应用程序中的注释字段 首先 这个应用程序有一个自定义属性源 源是Map
  • 为什么像素是浮动的?

    Canvas类的所有方法都使用float类型的坐标 但为什么 据我所知 这个坐标意味着显示上指向的像素数 像素可以分离吗 某些设备支持亚像素精度 在标准 LCD 屏幕上 一个像素实际上是三个子像素 一个红色 一个绿色 一个蓝色 红绿蓝 子像
  • WPF拖动距离阈值

    我有一个带有两个 WPF 树视图的程序 允许在两者之间拖放 问题是 打开 关闭树视图上的项目可能很烦人 因为在按住鼠标左键的同时将鼠标移动一个像素会触发拖 放功能 有没有某种方法可以指定鼠标在被视为拖放之前应移动多远 有一个系统参数可以实现
  • 将 Spring 配置划分到多个项目

    我们有很多项目使用相同的代码库 后端代码 只是前端往往有所不同 我们认为最好的方法是将后端和前端分成不同的项目 Engine and 项目名 现在这些是 Spring 项目 因此 如果我们也划分 Spring 配置 这似乎才合乎逻辑 数据库
  • 当 Ionic 电子商务应用程序中购物车中的产品数量增加时,总价格不会更新

    我正在研究离子电子商务应用程序并使用 Laravel 中的 API 我已将产品添加到购物车中 但是当我增加购物车中的产品数量时 产品价格增加 但总价格没有更新 并且从购物车中删除产品时 也没有更新价格 这是我的购物车 html
  • Azure DevOps Server 2019 保留策略不再有效

    上周 我们已在 ADS 2019 1 服务器上从 TFVC 迁移到 Git 在我们的验证管道中 我们有积极的保留政策 它设置为保留 2 天 使用分支过滤器 进行 10 个良好构建 并清除所有复选框 ADS 将其写为 refs heads 我
  • 在 Python 2.6 上安装 geopandas

    这是我之前的问题的延续Python 中的地理空间分析 https stackoverflow com questions 33427170 geospatial analytics in python 我开始了一个新问题 以使这两个问题在逻
  • 折线不在道路上:它从一个点直接延伸到另一个点

    我的地图包含多个点来点击用户经过的位置 但是折线不显示在道路上 但显示从一个标记到另一个标记的直线 https i stack imgur com 3RWlU jpg 我希望我的折线穿过马路 当道路转弯时 它也应该转弯 这是我的相关代码 d
  • SVN 挂钩不工作

    我有一个分支和主干的服务器存储库 分支是所有团队成员的存储库 我正在尝试使用svn hooks仅在我的分支下的仓库中 但它似乎工作得不好 以下是我尝试采取的步骤 检查过了my repo从远程服务器的branch my repo 自本地回购以