天道酬勤,学无止境

SVN 发布/预提交钩子以检查 Windows 上的 php 语法(SVN post/pre commit hook to check php syntax on windows)

问题

我最近将我的 SVN 服务器迁移到了 Windows 服务器。 一切都进行得非常顺利——好得令人难以置信——所以结果出来了。

我有/有一个预提交钩子,它对提交的任何 PHP 文件运行语法检查,如果检查失败,则拒绝提交并显示合适的错误消息 - 我将在下面复制它。 显然这在 Windows 上不起作用,我也找不到替代方法。 外面有人有东西吗?

我真的不知道从哪里开始转换以下内容以在 Windows 系统上运行,特别是考虑到它依赖的 *nix 工具的数量:-S

我已经阅读了关于使用 Codesniffer 之类的东西进行 PHP 检查的预提交钩子 - 是我最好/最简单的路线吗?

#!/bin/bash
REPOS="$1"
TXN="$2"
PHP="/usr/bin/php"
SVNLOOK=/var/www/UberSVN/ubersvn/bin/svnlook

CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | awk '{print $2}'`
ERRORSA=0
for LINE in $CHANGED
  do
  FILE=`echo $LINE | egrep \\.php$`
  if [ $? == 0 ]
  then
   MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "${FILE}" | $PHP -l`
   if [ $? -ne 0 ]
   then
    ERRORSA=1
    echo "---------------------------------------------------------------------------------" 1>&2
    echo "${FILE}: $MESSAGE" | sed "s| -| $FILE|g" 1>&2

   fi
  fi
 done
if [ $ERRORSA == 1 ]
then
    echo "---------------------------------------------------------------------------------" 1>&2
    echo "Please correct the errors and try commit again. $ERRORSA" 1>&2
exit 1
fi
exit 0
回答1

归功于我的同事,我将这个小问题传递给了他,对于任何未来的寻求者,下面是一个预提交钩子,它将在 Windows 托管的 SVN 服务器上进行 PHP 语法检查(还检查用户是否输入了提交消息)。 希望其他人会发现这很有用:)

@echo off  
 :: Stops commits that don't include a log message of at least 6 characters.        


@echo off  

 setlocal enableDelayedExpansion

 rem Subversion sends through the repository path and transaction id  
 set REPOS=%1  
 set TXN=%2  


 svnlook log %REPOS% -t %TXN% | findstr ...... > nul  
 if %errorlevel% gtr 0 (goto err) else (goto cont)

 :err  
 echo --------------------------------------------------------------------------- 1>&2   
 echo Your commit has been blocked because it didn't include a log message. 1>&2  
 echo Do the commit again, this time with a log message that describes your changes. 1>&2
 echo --------------------------------------------------------------------------- 1>&2  
 exit 1  

 :cont

svnlook changed %REPOS% -t %TXN% |findstr /I /R "\.php$ \.phtml$" >lint.txt
for /F "tokens=2* delims= " %%i in (lint.txt) do (
    set fname=%%i %%j
    for /l %%a in (1,1,31) do if "!fname:~-1!"==" " set fname=!fname:~0,-1!
    svnlook cat %REPOS% -t %TXN% "!fname!" | D:\PHP\php -l | findstr /I /B /V "No syntax errors" 1>&2
    if !errorlevel! neq 1 (
        echo in "%%i %%j" 1>&2
        echo. 1>&2
        echo --------------------------------------------------------------------------- 1>&2
        exit 1
    )
)
del lint.txt
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • svn:E165001:提交被预提交钩子(退出代码 255)阻止,没有输出。 如何解决这个问题?(svn: E165001: Commit blocked by pre-commit hook (exit code 255) with no output. How can this be solved?)
    问题 我正在尝试使用 Phabricator 配置 svn。 到目前为止,一切似乎都在工作,除了提交更改。 当我尝试提交任何代码时,我收到以下错误消息: svn: E165001: Commit blocked by pre-commit hook (exit code 255) with no output. 需要明确的是,有问题的错误消息是由 svn 客户端程序输出的。 好像是svnserve遇到各种问题的时候发的,比如因为某些原因不能运行hook。 它不必由钩子提供。 如果我删除预提交钩子,提交会按预期进行。 出于测试目的,我创建了一个非常简单的钩子,如下所示: #!/bin/sh echo "testing" >&2 exit 1 使用此挂钩时,我也收到相同的错误消息。 在这种情况下,尝试解决更复杂的脚本没有多大意义,直到它可以工作为止。 很可能通过解决这个脚本,原来的脚本也能工作。 我一直在用这个脚本进行测试,我在这个问题中发布的所有内容都适用于这个脚本。 基本上,此时此刻,我所展示的脚本确实是我正在尝试制作的脚本。 我已经禁用了 Phabricator 守护进程,否则预提交脚本会被 Phabricator 覆盖。 以下是我认为可能有助于解决此问题的一些信息,基于我迄今为止看到的有关此错误消息的内容: 该存储库由运行 svnserve 的用户 phd 所有。
  • 运行 SVN 预提交挂钩时如何向用户发送标准输出(How to send stdout to the user when running SVN pre-commit hook)
    问题 我有一个 SVN 的预提交钩子,它运行错误检查程序并在出现问题时中止提交。 如果出现问题,stderr 被重定向到发起提交的用户。 但是,即使没有发现问题,我也想从错误检查程序发送用户输出,以便通知用户错误检查程序运行并且没有发现问题。 如何使用 SVN 预提交钩子来做到这一点? 回答1 Subversion 钩子吃掉它们的 STDOUT。 一旦脚本运行,就没有 STDOUT。 您甚至不能让预提交脚本将 STDOUT 发送到另一个进程。 但是在预提交钩子内部,STDOUT 仍然存在并且仍然可以重定向。 例如,我的钩子由一个 shell 脚本组成,该脚本由几行 Unix 命令行实用程序组成。 每个命令行实用程序都有一个 STDIN 和一个 STDOUT,我可以通过管道从一个连接到另一个。 但是,一旦该钩子脚本完成执行,就没有 STDOUT。 另一件事是无法通过钩子范式与 STDOUT 进行通信。 Subversion 不提供任何类型的通信链接。 STDERR 有一个链接,但前提是钩子本身失败了。 这是一个预先提交的钩子,我怀疑你故意想让这个钩子失败只是为了给用户报告。 您可以做的是使用其他通知方法。 有些人建议使用电子邮件。 您可以运行提交后脚本以根据用户的电子邮件地址生成报告并通过电子邮件发送该报告。 我不会将此作为预提交触发器,因为您不希望事务因报告不起作用而失败。
  • SVN会在签入时自动格式化代码吗?(SVN automatic code formatting on check in?)
    问题 这可能吗? 如果是这样,我该怎么做? 代码在C#中,我们使用的是TortoiseSVN。 我只是想在每次检查时自动格式化代码。 非常感谢 回答1 您触及的是圣战。 弄乱人们的格式要求干草叉和火把。 我的建议:不要。 更不用说,如果您正在使用C#,并且您的开发人员正在使用Visual Studio,则VS有很多自动格式化工具。 只需输入该大括号和VS就可以/将自动格式化您的代码。 更好的解决方案可能是使所有开发人员都使用相同的自动格式设置。 工具->选项,文本编辑器-> C#->格式化 这些设置是可导出的,因此,如果您让团队同意在VS中使用相同的代码格式设置,则可以避免在源代码控制系统中执行该代码的麻烦,最好由它来做最好的事情。 如果您对此一无所知,那么就像其他人所说的那样,预先提交钩子是可行的方法。 如果您的SVN服务器正在Windows上运行,我是否建议您使用CaptainHook编写钩子脚本? 可以用任何.NET语言编写的可插入的hookscripts。 回答2 使用预提交的钩子脚本,您可以做到这一点,是的。 但是我确信您将在第一次提交后删除该脚本,因为您会遇到很多问题。 如果您修改要提交的数据,那么客户端将不知道这一点。 因此,在您的脚本“修复”文件格式的提交之后,存储库中的文件内容与工作副本中的文件不同。 但是您的工作副本仍然认为它与存储库是最新的(毕竟
  • SVN 最佳实践 - 在团队中工作(SVN best-practices - working in a team)
    问题 我开始使用 SVN。 我知道基本命令并了解基本原理。 我想知道是否有人有在团队环境中使用 Subversion 的任何技巧或最佳实践。 我可以看到在提交代码时添加合理冗长的消息的好处,但是还有其他我应该记住的事情吗? 感谢所有伟大的答案 - 他们帮助了很多。 回答1 鼓励频繁提交。 不熟悉版本控制的队友可能会觉得他们需要将代码保留在存储库之外,直到“它工作正常”。 教导每个人尽早承诺并经常尽快发现问题。 与其持有代码直到它工作,不如建议你的团队成员为可能破坏主干的功能创建分支。 这导致... 建立分支和标记实践。 除了功能分支之外,还鼓励您的团队成员使用分支来修复大型错误。 在工作开始和结束时标记主要错误修复。 维护生产/质量保证版本的标签(可能还有分支)。 为主干制定政策并坚持下去。 一个例子可能是,“主干必须始终无误地构建。” 或“主干必须始终通过所有单元测试”。 任何还不能满足主干标准的工作都必须在一个分支中完成。 回答2 不要随代码更改提交格式更改 如果你想重组一个巨大文件的空白( Control + K + D ),很好。 将格式更改与实际的逻辑更改分开提交。 如果您想在文件中移动函数,也是如此。 将移动与实际编辑分开提交。 回答3 我始终坚持的关键概念之一是一起提交相关的代码更改。 推论是不要在同一次提交中提交不相关的代码更改。 这意味着不要在一次提交中修复 2
  • SVN预提交挂钩,避免更改标签子目录(SVN pre-commit hook for avoiding changes to tags subdirectories)
    问题 是否有人清楚地说明如何添加一个预先提交的挂钩,以免更改标签子目录? 我已经在互联网上搜索了很多。 我找到了此链接:SVN :: Hooks :: DenyChanges,但是我似乎无法编译东西。 回答1 我没有足够的声誉来对Raim的上述回答进行“评论”,但是他的表现很好,除了一个例外,他的grep模式是错误的。 我只是将以下内容用作我的预提交钩子(我没有现有的钩子,在这种情况下,您需要合并): #!/bin/sh REPOS="$1" TXN="$2" SVNLOOK=/opt/local/bin/svnlook # Committing to tags is not allowed $SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1 # All checks passed, so allow the commit. exit 0 Raim的grep模式的唯一问题是,如果它位于回购的“根”,则仅与“标签”匹配。 由于我的存储库中有多个项目,因此他编写的脚本允许在标记分支上进行提交。 另外,请确保按指示按chmod + x进行操作,否则您会认为它在提交失败后一直有效,但在失败时无法执行预提交钩子
  • 是否可以从 PHP 检查 PHP 文件语法?(Is it possible to check PHP file syntax from PHP?)
    问题 我使用自动加载动态加载 PHP 类文件。 这些文件可能由于某种原因丢失或损坏。 自动加载将成功报告丢失的文件,以便应用程序逻辑可以处理。 但是,如果这些文件已损坏,则整个处理将停止,并显示用户的空白屏幕和错误日志中的“PHP 解析错误:语法错误”。 是否可以从 PHP 代码检查 PHP 文件的语法? 我在这里看过:http://us.php.net/manual/en/function.php-check-syntax.php - 它已被弃用。 和 exec("php -l $file"); 似乎是错误的方式(http://bugs.php.net/bug.php?id=46339) 想法? 回答1 您真的不应该尝试在执行时检查不正确的 PHP 文件:它会缩短应用程序的响应时间! “更好的方法”是在修改完 PHP 脚本后从命令行使用 php -l ; 或者如果您正在使用它,请将其包含在您的构建过程中; 或者,如果您使用的是 SVN 并且可以定义 SVN 钩子,则将其作为 SVN 预提交钩子插入。 在我看来,几乎任何给定的解决方案都比在执行时自己检查要好! 考虑到您想要避免的错误可能不会经常发生,最好……就让它们发生吧。 唯一的事情是:激活日志并监控它们,能够在出现问题时快速检测:-) 当然,这并不妨碍您处理丢失文件的情况; 但那是另一回事... 回答2
  • 在 Windows 批处理文件中包装 SVN Python 钩子(Wrapping an SVN Python hook in a Windows batch file)
    问题 我有一个以前驻留在 Linux 服务器上的 SVN 预提交钩子。 我现在正试图将事情转移到 Windows (Server 2003) 服务器上。 这个钩子是用 Python 编写的,它在 Linux 上运行良好,顶部的#!/usr/bin/env python行。 然而,Windows 不是这样工作的,它要求钩子是批处理文件(或其他格式,但仍然不是 Python)。 重要的是参数被传递给脚本,退出代码被返回给调用进程(SVN 服务器),以便它知道是否允许提交。 我对.bat文件语法几乎一无所知,但我认为这样的事情可以解决问题: C:\Python26\python.exe pre-commit.py %1 %2 我认为这是包装 Python 脚本的最简单方法是否正确? 它会自动返回脚本的退出代码吗? 回答1 回答我自己的问题:这几乎有效。 退出代码是通过ERRORLEVEL变量检测的,但是由于环境为空,必须完整指定脚本的路径。 幸运的是,第一个参数包含存储库的位置,所以它只是: C:\Python26\python.exe %1\hooks\pre-commit.py %1 %2
  • 尝试创建一个验证外部的预提交钩子(Trying to create a pre-commit hook that verify externals)
    问题 我目前正在尝试创建一个预提交钩子,以防止用户使用不是标签的外部标记代码版本。 我只是想找出一种方法来获取在事务中指定的外部,但无法弄清楚如何。 命令 svnlook 似乎无法返回任何看起来像外部修改的远程内容。 使用 svn 命令,它似乎是我无法指定的事务。 我不知道在我的预提交钩子中使用什么命令。 我目前在 Windows 中,但正在制作一个 python 脚本,以便能够在我们的 linux 服务器上进行测试。 到目前为止我测试的是以下内容: svnlook propget C:\TestReposLocal svn:externals <== Give me error something is missing svn propget svn:externals C:\Test <== Give me externals but I cant figure out how to get this from a transaction to place in a pre-commit hook. 在我的存储库 (C:\TestReposLocal) 中,我有一个外部存储库,它是另一个存储库的主干。 这个存储库是用 svn propget 命令显示的,但我需要在预提交中知道当前事务是否这个外部不是标签。 任何帮助都会很高兴收到。 Tnx 回答1 好吧
  • 以 SVN 中的预提交为基础(Build on pre-commit in SVN)
    问题 我知道这已经被问到了,但我们真的很想拒绝任何提交文件的尝试,这会破坏主干中的项目。 拒绝提交的文件的决定是基于正在提交的文件所属项目的构建过程的结果。 我知道在预提交阶段无法同时访问存储库,但这对我们来说不是问题,因为我们的构建速度非常快并且我们可以容忍任何延迟。 有什么工具可以实现我们想要的吗? 请注意,需要重新编译整个项目单元,而不仅仅是提交的单个文件。 如果这不能以任何合理的方式完成,是否可以在提交后构建代码,然后在构建步骤失败时立即回滚? Hudson 或其他工具可以配置成我们想要的吗? 回答1 即使您的构建速度很快。 假设您可以在 90 秒内构建整个项目。 您是否希望人们每次提交代码时都等待 90 秒? 可能发生的情况是,人们只会做更少的提交,做出更大的改变,并导致更多的错误。 首先要意识到,提交错误的修订并不是世界末日。 如果您及早发现问题,您可以轻松恢复更改。 这里的关键是早期发现。 如果您还没有,请获取一个像 Jenkins 这样的持续集成系统。 每当有人对代码进行更改时,Jenkins 都会进行构建。 如果构建与您声称的一样快,当更改中断构建时,您将在几分钟内收到通知。 如果您愿意,您甚至可以让 Jenkins 恢复更改。 我们的理念是开发人员有 10 分钟的时间来解决问题,或恢复他们的更改。 然后,我们把它们放在寨子里,用腐烂的西红柿给它们剥皮。 (实际上
  • SVN 预提交钩子相同的消息(SVN Pre-Commit Hook For Identical Messages)
    问题 我的同事们都很固执。 一开始他们会在没有消息的情况下提交,所以我试图教育他们并放入一个预提交脚本以检查是否为空,以防他们忘记。 然后他们会像“已修复”一样输入消息,所以我再次与他们交谈并更新了脚本以强制它链接到错误跟踪器。 现在,他们为同一个文件连续 8 次放入相同的提交消息(Bug ID:Bug Title)。 在我与他们讨论这没有帮助之后,我如何制作一个预提交钩子来检查提交消息是否与最后 20 条提交消息之一不同? 回答1 您可以在预提交挂钩中使用 SVN 命令或任何其他 shell 命令。 您只需要提供已安装工具的完整路径。 请记住,这是在服务器上运行的,因此它具有对存储库的 file:// 访问权限。 因此,请执行svnlook log (首选)或svn log并检查结果输出是否与当前日志消息匹配。 回答2 svnlook 有 2 个选项组合在一起可以解决这个问题。 svnlook 日志 http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.log.html svnlook 最年轻的 http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.youngest.html 最年轻的得到头部修正。 然后我将最后 20 次提交回显到一个临时值。 文件并使用 grep
  • 除了从分支合并之外,如何锁定SVN主干?(How to lock SVN trunk except for merges from branch?)
    问题 我想阻止开发人员直接在主干上工作。 我的目标是强制所有开发人员离开主干并在自己的分支上工作,直到 CI 测试被清除。 然后他们必须从主干合并到他们的分支(以获取最新的更改),在合并回主干之前运行并通过测试。 这种 SVN 使用风格有什么规则吗? 回答1 限制主干提交给机器人。 该机器人可以进行无冲突合并并提交到主干。 我就是这样做的; 它被称为合并机器人(MIT 许可)。 它是一个守护进程和一个 Trac 插件,提供了一种为每个工单创建一个分支的方法。 文档很薄,在极端情况下存在问题,但大多数情况下都有效。 回答2 为了只允许合并到主干中,您可以使用预提交钩子来尝试区分合并与普通提交并拒绝后者。 您可以通过检查是否更改了任何路径上的“svn:mergeinfo”属性来判断提交是否为合并。 这个邮件列表线程有两个检查合并信息的钩子示例。 这些示例实际上试图在特定路径上强制执行它的缺失,但是如果您颠倒逻辑,您可以制作一个仅接受合并的钩子。 开发人员仍然有可能在合并时故意加入其他更改,并且不可能检测到这种情况。 这样的预提交钩子可以温和地提醒开发人员,他们可能打算签入分支而不是主干,但只有在他们不故意试图绕过策略时它才有效。 一个更可靠的解决方案是将主干的写访问权限限制为您信任的少数用户可以做正确的事情。 然后,这些用户必须在每种情况下都执行最后的“合并回主干”步骤。
  • SVN结帐或导出以用于生产环境?(SVN checkout or export for production environment?)
    问题 在我正在从事的项目中,我们的开发团队之间正在进行讨论-是将生产环境部署为SVN存储库中的签出还是导出? 开发环境显然是一种签出,因为它会不断更新。 对于生产而言,我本人亲自检查主干,因为它使将来的更新变得更容易(只需运行svn update即可)。 但是,有些开发人员对此表示反对,因为svn会使用svn进程的组/所有者和权限来创建文件(这是在linux操作系统上,因此这很重要),并且在生产环境中也具有.svn目录他们有点脏。 此外,如果是结帐,那么如何在不包含开发内代码的情况下将单个功能推送到产品中? 您对每个功能使用标签还是分支? 有其他选择吗? 编辑:我可能还不清楚-要求之一就是能够不断地将修复推送到生产环境中。 我们希望避免仅用于推送关键修复程序的完整构建(比简单的更新要花费更长的时间)。 回答1 Subversion FAQ似乎主张将部署作为签出,并使用提交后的钩子脚本自动更新。 通过在httpd.conf中添加以下内容,它们可以防止Apache导出.svn文件夹(可能是个好主意): # Disallow browsing of Subversion working copy administrative dirs. <DirectoryMatch "^/.*/\.svn/"> Order deny,allow Deny from all <
  • 自动化 SVN 预先提交给审查委员会,然后在批准后提交给 SVN [关闭](Automating SVN pre-commit to Review Board and then Commit to SVN after approval [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 2年前关闭。 改进这个问题 我的目标是使用 SVN 预提交挂钩将审查请求直接发布到审查委员会,而不是将其提交到存储库。 作为第二步,我希望在批准差异时它应该自动转到存储库。 那有可能吗? 如果是,那么一些指针将不胜感激。 有很多地方解释了配置提交后,但我在谷歌上找不到任何东西。 编辑:试图详细说明问题 所以最近我们完成了审查委员会的设置。 我们使用审查委员会 post-review hook 与 SVN 进行了集成。 一旦用户使用“发布评论”字符串提交,它就会进入评论委员会。 现在我想要实现的是这个 1.用户从SVN提交。 如果进入存储库,更改应该以差异(自动)的形式进入审查委员会。 2.review应该分配给默认的reviewer(对于初学者来说,以后可能可以在commit string中指定) 3. 审稿人将对其进行审核。 批准后应将差异提交到存储库(自动或手动) 回答1 您可以使用 pre-commit hook 阻止提交并传输到 RB(块很明显,传输 - “如果你可以手动完成 - 它可以自动化”,但需要有关操作的更多详细信息才能获得明确的答案) 已批准更改的提交不是钩子的任务,它将是额外的独立自动提交,并且此过程可能包含一些陷阱
  • 什么是SVN中的pre-revprop-change挂钩,如何创建它?(What is a pre-revprop-change hook in SVN, and how do I create it?)
    问题 我想在资源库浏览器中编辑日志注释,并收到一条错误消息,指出该资源库不存在pre-revprop-change挂钩。 除了具有可怕的名称之外,什么是pre-revprop-change钩子,如何创建它? 回答1 基本上,它是在修改存储库中未经版本控制的属性之前启动的脚本,以便您可以更精确地管理存储库中发生的事情。 SVN发行版中的/ hooks子目录中有用于不同挂钩的模板(* .tmpl,您必须根据自己的操作系统进行编辑和重命名才能激活)。 回答2 对于Windows,这是一个示例批处理文件的链接,该文件仅允许更改日志消息(不允许其他属性): http://ayria.livejournal.com/33438.html 基本上,将以下代码复制到文本文件中,并将其命名为pre-revprop-change.bat并将其保存在存储库的\hooks子目录中。 @ECHO OFF :: Set all parameters. Even though most are not used, in case you want to add :: changes that allow, for example, editing of the author or addition of log messages. set repository=%1 set revision=%2 set
  • 为什么在检查特定分支是否已提交时,提交后钩子条件语句为什么不起作用?(Why is my post-commit hook conditional statement not working when I check to see if a particular branch was committed?)
    问题 我正在Windows服务器上通过VisualSVN Server运行Subvbersion,并使用一个干线和三个分支来设置我的存储库。 这些分支是开发人员,测试人员和生产人员。 我有一个要运行的提交后提交钩子,该钩子在运行提交后会更新工作副本,但是我只希望它在dev分支中进行提交时更新该工作副本。 这是我现在拥有的代码... @setlocal enableextensions enabledelayedexpansion @echo off SET str1=%1 IF NOT x%str1:dev=%==x%str1% ( pushd <path to working copy> svn update --username <svn_username> --password <svn_password> echo update complete ) endlocal 如果我删除条件条件,则更新将在每次提交时运行,因此我知道条件条件工作中的代码。 我还已将条件条件作为常规批处理文件进行了测试,并向其发送了诸如“ branches / dev”和“ branches / test”之类的字符串,并且在这些测试中它的行为正常。 但是,当我将其另存为提交后的钩子脚本时,无论提交是在dev分支中还是在其他分支中,它都永远不会运行。 编辑:根据已回答此问题的反馈
  • 将 Subversion Edge 移动到新服务器后无法提交到 SVN(Cannot commit to SVN after moving Subversion Edge to new server)
    问题 我可以结帐、浏览历史记录等...但是当我尝试使用 Tortoise SVN 提交任何更改时,出现错误: 提交失败(详情如下): 提交被预提交钩子(退出代码 255)阻止,输出: 该系统找不到指定的路径。 如果您想打破锁定,请使用“检查修改”对话框或存储库浏览器。 这是在我们设置新服务器并从旧服务器复制存储库数据之后发生的。 服务器上的错误日志包含: [Tue Dec 08 13:23:29.696220 2015] [dav:error] [pid 9044:tid 920] [client 192.168.16.150:59995] 无法合并资源“/svn/Phil/!/svn/Phil/!/svn/tid 920”进入“/svn/Phil”。 [500, #0] [Tue Dec 08 13:23:29.696220 2015] [dav:error] [pid 9044:tid 920] [client 192.168.16.150:59995] 提交被预提交钩子(退出代码 255)阻止,系统无法输出:\n找到指定的路径。\r\n [500, #165001] [Tue Dec 08 13:23:29.789973 2015] [dav:error] [pid 9044:tid 920] [client 192.168.16.150:59997] 无法获取资源信息。
  • 此客户端太旧,无法使用工作副本(This client is too old to work with working copy)
    问题 我在谷歌上的任何地方都会得到相同的答案,但这对我来说是错误的答案。 最初我在我的服务器上安装了适用于 Windows 的 Subversion 1.5.6(我运行 Windows Server 2008),并为一个项目创建了一个存储库。 然后我在我的笔记本电脑上使用 Tortoise 客户端版本 1.6.X 来更新项目。 在我尝试使用提交后挂钩脚本之前,一切都是笨手笨脚的(我在提交时更新 wwwroot 中的文件夹以反映网页上的更改)。 我收到一条消息,大意是“此客户端太旧,无法使用工作副本‘XXX’”。 所以我在我的笔记本电脑上卸载了 SVN 客户端,并从服务器中删除了存储库。 然后我从头开始在服务器上创建了一个新的存储库,并安装了 TortoiseSVN 1.5.6 版,认为如果客户端版本与服务器上的 Subversion 相同,那么它们应该会很好。 再次在笔记本电脑上下载存储库并重新安装挂钩脚本后,我收到相同的消息... 不得不不断删除我的存储库并重新安装我的客户端以找到通过反复试验来合作的客户端,这是非常费力和破坏性的。 如果 TortoiseSVN 和我的服务器 Subversion 都是 1.5.6,我认为没有理由(并且在网上找不到任何理由)为什么存储库会争论。 有没有人可以对我为什么会收到这条消息提供一些见解? 也许甚至有人能让我知道我需要使用哪个版本的
  • 有没有一种快速的方法来锁定我的 SVN 存储库的主干?(Is there a fast way to lock my SVN repository's trunk?)
    问题 有时我需要确保没有人对特定分支或我的主干做出承诺。 发布版本和重新集成合并就是一个例子。 SVN“锁定”所有文件是不现实的(因为项目很大)。 我也不相信锁定会阻止某人提交新文件。 在我完成我正在做的事情之前,确保没有人向文件夹提交任何内容的快速方法是什么? 谢谢 回答1 在为发布版本编译项目时,我们遇到了这个问题,其中构建服务器属性(CruiseControl.NET 项目标签)用作程序集和安装程序版本的一部分。 在您分支(或标记)工作副本的地方,解决方案很简单,例如发布版本。 工作流程: 签出主干(或分支)的新工作副本。 构建您的版本,这会更新文件,使您的工作副本处于修改状态。 如果您的构建成功,svn 将工作副本复制到您的新分支或标签中。 如果您想在没有分支的情况下提交工作副本,那么正如您所说,如果有人修改了存储库的该路径,这将失败(或至少是不可靠的)。 解决此问题的一种方法是使用 svn 授权控制,将构建服务器用户添加到 svn 并为存储库提供不同的authz文件。 工作流程: 将authz替换为授予构建服务器用户写入权限和所有其他用户读取权限的文件。 按照正常方式执行构建。 将authz替换为授予所有用户正常访问权限的文件。 请注意,svn 授权允许基于路径的控制,因此您可以将其限制为中继(或其他任何地方)以减少对用户的影响。 使用类似方法(相同工作流程
  • 如何最好地从颠覆更新网站(How to best update a website from subversion)
    问题 我有一个由 MySQL 数据库支持的 PHP 网站和一个向 subversion 提交代码的小型程序员团队。 通常我们编写代码,在本地进行测试,提交到 Subversion,然后将更改的文件复制到隐藏区域进行在线测试。 然而,可能会犯错误。 有时我想刷新站点,以便毫无疑问地知道站点代码和数据库确实代表了颠覆中的内容。 我想尽可能接近一键式解决方案,以确保万无一失。 最好的方法是什么? 顺便说一句,如果重要的话,我们在 Windows 机器上开发。 回答1 每次提交后都可以使用 post-commit 钩子自动完成导出: http://svnbook.red-bean.com/en/1.5/svn.ref.reposhooks.post-commit.html 您可以设置钩子自动导出隐藏区域内的项目以进行在线测试。 回答2 我不建议将您的代码签出到您的生产服务器。 这可能会暴露服务器上的 svn 控制文件 (.svn)。 我建议使用脚本(python、ruby 等)结合命令行 svn 和 FTP 客户端将文件从 svn 和 ftp 导出到服务器。 svn export 命令可用于从 svn 服务器检出一组文件,而无需所有 .svn 目录。 此外,不要忘记在执行此操作时标记 svn 存储库,以便您拥有已部署内容的检查点。 回答3 我们通过 Subversion
  • SVN显示用户名而不是用户ID(SVN show usernames instead of user ids)
    问题 因此,我们有了这个SVN存储库,在该存储库中,更清晰地显示了较早的提交者名称,并且更容易跟踪谁做了什么。 最近,svn信息库已移至另一台服务器并进行了设置,因此现在当我们检查日志时,我们只能看到作者的用户ID。 我相信我们可以更新服务器中的SVN authz或其他设置文件来添加作者姓名。 我想问的是,在客户端有什么方法可以做到这一点? 主要是因为我们没有修改SVN服务器设置的权限。 有没有办法我可以拥有一个道具或可以在其中进行映射的东西,它可以显示在日志中。 我正在使用tortoiseSVN作为SVN客户端。 回答1 这些Subversion用户ID来自何处? 您的Subversion是否像Windows Active Directory一样与LDAP集成在一起,还是这是一个单独的Subversion授权文件? 用户ID是否从旧服务器(人们用来使用其名称的旧服务器)更改为当前用户ID? 我可以想到两件事: 您通过LDAP使用Windows AD,旧服务器针对用户的cn属性进行验证,而新服务器针对sAMAccountName验证。 您的旧服务器有一个提交后钩子,该钩子将svn:author修订版属性从用户的登录ID更改为用户的名称。 您还有旧的Subversion服务器吗? 您应该查看是否可以找到设置上的差异。 附加评论 谢谢大卫。 由于访问限制,尽管不确定我是否能够进行检查