天道酬勤,学无止境

SVN post/pre commit hook to check php syntax on windows

I have recently migrated my SVN server to a windows server. It all went very smoothly - it was too good to be true - so it turned out.

I have/had a pre-commit hook which ran a syntax check on any PHP file committed and rejected the commit with a suitable error message if it failed the check - I will copy this below. Obviously this does not work on Windows, and I have not been able to find an alternative which does. Does anyone out there have anything?

I wouldn't really know where to start converting the below to run on a Windows system, expecially given the number of *nix tools it is reliant on :-S

I have read about pre-commit hooks which use things like Codesniffer to do the PHP checks - is something like that my best/simplest route?

#!/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
标签

评论

Credit goes to my colleague to whom I passed this little problem on to, and below for any future seekers, is a pre-commit hook which will do a PHP syntax check on Windows hosted SVN servers (also checks the user has entered a commit message). Hopefully someone else will find this useful :)

@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 所有。
  • 是否有 Subversion Checkout Hook 或类似的东西?(Is there a Subversion Checkout Hook or something similar?)
    问题 我正在使用一个 subversion 存储库,我想知道每当有人要求我的存储库结帐时; 像“svn co”或“svn up”。 当有人从我的 svn 服务器请求信息时,我可以使用钩子或其他方法来运行脚本或发送电子邮件吗? 如何在不依赖 apache 日志的情况下实现这一目标? 顺便说一句,这是一个非常简单的存储库,仅用于教育目的。 (如果您需要更多信息,请询问。提前致谢。) 回答1 以下是 Subversion 1.5 中所有支持的钩子,来自 Version Control with Subversion 一书: 开始提交预提交提交后 pre-revprop-change 后 revprop 更改预锁锁后预解锁解锁后 没有您描述的预结账或预更新挂钩。 回答2 如果您使用 TortoiseSVN,您可以访问客户端挂钩。 回答3 你可以做任何你想做的事情,使用 Apache 作为 SVN 服务器和(例如)mod_perl 来挂钩请求。 也许日志文件已经显示了您想要的信息。 通过 SSH 的 SVN 也应该是可能的:分析由 SVN 客户端启动的命令并包装它们(例如,通过使用“.orig”扩展名重命名原始二进制文件并将(shell)脚本放入该位置。
  • Jenkins CI:如何触发基于SVN提交的构建(Jenkins CI: How to trigger builds on SVN commit)
    问题 在将代码提交到SVN项目时,我需要设置哪些插件和插件功能才能使Jenkins作业触发构建? 我已经安装了标准的SVN插件以及SVN标记插件,但是我看不到任何允许触发器配置的新功能。 回答1 有两种方法可以解决此问题: 由于其易于实现,因此我最初建议使用第一个选项。 在构建过程中成熟之后,请切换到第二个。 轮询存储库以查看是否发生了更改。 如果在同一轮询间隔内有两次提交,则可能“跳过”提交。 在此处说明如何执行此操作,请注意第四个屏幕截图,您在该屏幕快照中基于轮询存储库(使用类似crontab的配置)在作业上配置了一个“生成触发器”。 将您的存储库配置为具有提交后挂接,该挂接通知Jenkins构建需要开始。 在此处的“提交后挂钩”部分中,说明如何执行此操作 SVN标记功能不是轮询的一部分,它是将源代码的当前“头部”提升为标记以对构建进行快照的一部分。 这使您可以将Jenkins buid#32称为SVN标签/ tags / build-32(或类似名称)。 回答2 您只需要一个插件,即Subversion插件。 然后,简单地进入Jenkins→job_name→构建触发器部分→(i)远程(即从脚本)触发构建身份验证令牌:Token_name 转到SVN服务器的hooks目录,然后启动以下命令: cp post-commit.tmpl post-commit chmod 777
  • 适用于Windows Pre-Commit Hook的GitHub(GitHub for Windows Pre-Commit Hook)
    问题 我们有一个开发团队,该团队使用GitHub的50/50分割用于Windows,使用Bash shell进行Git管理。 我们已经实现了一个预提交挂钩(旨在运行单元测试,并在测试失败时使提交失败)。 作为简化版本,我附加了一个简化版本,在该版本下方演示了我们的问题。 #!/bin/sh exit 1 如果我们尝试从bash shell提交,则按预期的提交将失败。 但是,如果我们从GitHub for Windows应用程序执行相同的提交,则它将成功提交到本地存储库。 那么,有谁知道我们如何从GitHub应用程序中获得相同的功能? 不幸的是,我们无法将用户从应用程序中移开,这显然是一个漏洞。 谢谢你的帮助。 回答1 不好意思,这很抱歉,但是Windows的GitHub不支持预提交钩子,因为它使用libgit2进行提交。 回答2 使用Git shell,您可以拥有提交钩子。 我有一些使用PowerShell的提交挂钩。 我找到了一个执行了lint的powerShell脚本,我将其扩展为运行phpunit和phpcs(路径是硬编码的,因此您需要进行调整): 预提交文件: #!/bin/sh echo exec powershell.exe -ExecutionPolicy RemoteSigned -File '.\.git\hooks\pre-commit-hook.ps1'
  • 是否可以从 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
  • puppet结合SVN版本控制系统实现版本的集中化备份与恢复
    一、介绍通过安装部署Puppet C/S模型,实现Puppet Server端管理所有被控制机的整个生命周期:从初始化到软件升级、从配置文件创建到测试部署、从系统维护到服务器迁移等。Puppet能够持续化的与被控制机进行交互,从而实现配置文件的及时检测更新。结合SVN版本控制系统,puppet可在更新之前将当前正在运行的环境以版本的方式保存到SVN版本控制系统中,方便以后通过puppet更新出错或者需要回滚到之前的某一个环境时快速恢复。 二、环境介绍序号 服务器类型 版本/IP参数 1 PuppetMaster RHEL6.4 x86_64(192.168.100.110) 2 PuppetAgent RHEL5.8 x86_64(192.168.100.111)和RHEL5.7 x86_64(192.168.100.112) 3 SVN Service端 RHEL6.4 x86_64(192.168.100.110) 4 SVN Service端 RHEL6.4 x86_64(192.168.100.110)和Windows 8.1 x86_64(192.168.100.2) 编号 类型 主机名/软件名称 系统/软件版本 其他信息 1 Software Subversion 1.6.11-7 rpm package 2 Software TortoiseSVN 1.8.2
  • post-commit 钩子在 svn 提交时产生错误,但在命令行上手动运行时有效(post-commit hook produces error on svn commit but works when run on manually on command line)
    问题 我目前正在尝试为我的 subversion 存储库设置 post-commit 挂钩以发送电子邮件通知。 我正在使用颠覆 1.7.8。 我的提交后钩子脚本如下: #!/bin/sh REPOS="$1" REV="$2" "$REPOS"/hooks/mailer.py commit $REPOS $REV "$REPOS"/mailer.conf 当我进行提交时,会产生以下错误消息: Traceback (most recent call last): File "/lib/python2.7/site.py", line 563, in <module> main() File "/lib/python2.7/site.py", line 545, in main known_paths = addusersitepackages(known_paths) File "/lib/python2.7/site.py", line 278, in addusersitepackages user_site = getusersitepackages() File "/lib/python2.7/site.py", line 253, in getusersitepackages user_base = getuserbase() # this will also set
  • post-commit hook produces error on svn commit but works when run on manually on command line
    I am currently trying to set up the post-commit hook for my subversion repository to send a email notifications. I am using subversion 1.7.8. My post-commit hook script is as follows: #!/bin/sh REPOS="$1" REV="$2" "$REPOS"/hooks/mailer.py commit $REPOS $REV "$REPOS"/mailer.conf When I make a commit the following error message is produced: Traceback (most recent call last): File "/lib/python2.7/site.py", line 563, in <module> main() File "/lib/python2.7/site.py", line 545, in main known_paths = addusersitepackages(known_paths) File "/lib/python2.7/site.py", line 278, in addusersitepackages user
  • PHP Syntax checking pre-source control
    Referring to Is there a static code analyzer [like Lint] for PHP files? -- I am looking at how to assess the content of PHP files before they are committed by developers. Whichever solution(s) are appropriate will be triggered via SVN hooks similar to the answer: Is it possible to check PHP file syntax from PHP? I came across this Automatic Syntax checking of PHP files when checking into SVN which is the angle I'm going for, however ... php -l isn't quite sufficient. For example, given the code: if ($foo == 'bar') { echo $foo; } This results in: 2012/01/15 02:51:14 [error] 694#0: *164 FastCGI
  • 在 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
  • SVN 钩子不起作用(SVN hooks not working)
    问题 我有一个分支和主干的服务器存储库。 分支是所有团队成员的存储库。 我试图仅在我的 repo 下的分支中使用svn hooks ,但它似乎不能正常工作。 以下是我试图接近的步骤: 签出my_repo从远程服务器的branch/my_repo 由于本地 repo my_repo没有任何内容,我在本地创建了一个新的 svn repo 并将包括/hooks文件夹在内的所有内容复制到my_repo 。 我在my_repo创建了一个空文件并添加了一行文本。 然后svn add这个文件。 修改了my_repo/hooks/pre-commit.tmpl文件并使其始终不通过错误代码 1。现在它看起来像: #!/bin/sh exit 1 将pre-commit.tmpl复制到 pre-commit 并添加 pre-commit 的执行许可给自己服务器包含其他人现在服务器的结构如下: - server - branch - my_repo - myfile - hooks - pre-commit - Tom's repo - other team member's repo - trunk 在签出的 repo 中,我使用以下命令svn commit -m "dumb change"了更改: svn commit -m "dumb change" 现在从这里我应该无法提交,它应该给我一个代码
  • Wrapping an SVN Python hook in a Windows batch file
    I have an SVN pre-commit hook that previously resided on a Linux server. I'm now trying to move things over to a Windows (Server 2003) server. This hook was written in Python, which worked fine on Linux with its #!/usr/bin/env python line at the top. Windows, however, doesn't work that way and requires hooks to be batch files (or other formats, but still not Python). The important thing is that the arguments get passed to the script and the exit code gets returned to the calling process (the SVN server), so that it knows whether or not to allow the commit. I know next to nothing about .bat
  • Git: pre-receive hook with PHP_CodeSniffer
    Since switching from SVN to Git, we lost the ability to enforce our coding standards through a pre-commit hook on the subversion server. With Git, you only have pre-commit hooks on the client which cannot be enforced in any way. What makes it worse is that we have developers working with all three main operating systems, thus a pre-commit hook that works on Linux or OS X does not automatically work on Windows. The way to go is implementing a pre-receive hook on the server, but the solution is not as easy as it seems: Imagine the developer did 20 commits and wants to push them. All pre-commit
  • 提交Subversion时可以运行脚本吗?(Can I run a script when I commit to subversion?)
    问题 我想运行一个脚本,为我的php项目构建文档。 它基本上只是使用wget运行phpdoc。 回答1 这是有关SVN挂钩的相当广泛的教程 回答2 (回答我自己的问题,我只是以为别人也想知道)。 是的,TortoiseSVN也支持它。 您要查找的词是“钩子”。 对于TortoiseSVN,打开设置和“挂钩脚本”。 单击“添加...”并选择post_commit_hook(在提交完成后运行)。 然后添加您正在运行的任何脚本以及该脚本的工作路径。 我使用了一个批处理文件并将其命名为wget(有一个Windows版本的端口,用google搜索)。 要使wget将来自phpdoc的日志存储在一个特定路径中,必须指定完整路径,否则该日志将存储在提交位置的当前文件夹中,因此我的批处理文件如下所示: SET BUILDLOG=%~dp0%build_log.html rem %~dp0 returns the full working path *of this script* SET PHPDOCURL=http://localhost/PHPDocumentor/docbuilder SET PHPDOCCONFIG=yourconfigfile wget -O %BUILDLOG% "%PHPDOCURL%/builder.php?setting_useconfig=
  • 将git钩子放入存储库(Putting git hooks into repository)
    问题 将.git/hooks放入项目存储库(例如,使用符号链接)是否被认为是不好的做法? 如果是,将相同的钩子传递给不同的git用户的最佳方法是什么? 回答1 我通常同意Scytale,并提供一些其他建议,足以值得单独回答。 首先,您应该编写一个脚本来创建适当的符号链接,尤其是在这些挂钩与执行策略或创建有用的通知有关的情况下。 如果人们只能键入bin/create-hook-symlinks不是必须自己这样做,则人们将更可能使用这些钩子。 其次,直接符号链接挂钩可防止用户添加自己的个人挂钩。 例如,我更喜欢示例预提交钩子,该钩子可确保我没有任何空格错误。 解决此问题的一种好方法是在您的存储库中放入一个挂钩包装脚本,并将所有挂钩符号链接到该脚本。 然后,包装器可以检查$0 (假设它是一个bash脚本;否则类似argv[0] )来确定调用它的是哪个钩子,然后在您的仓库中调用适当的钩子,以及适当的用户的钩子,将必须重命名,并将所有参数传递给每个参数。 内存中的快速示例: #!/bin/bash if [ -x $0.local ]; then $0.local "$@" || exit $? fi if [ -x tracked_hooks/$(basename $0) ]; then tracked_hooks/$(basename $0) "$@" || exit $? fi
  • 如何使用 SVN 提交后触发 Jenkins 构建?(How do I trigger Jenkins build with SVN post-commit?)
    问题 我正在尝试编写一个 SVN 提交后脚本,目的是意识到,每当开发人员之一提交到 SVN 存储库时,它都会触发 Jenkins 构建并自动部署项目。 我按照Subversion Plugin 中的说明进行操作,我的提交后如下: #!/bin/sh # # Jenkins SVN Build trigger script by Wessel de Roode Aug' 2011 # # Please adjust SERVER=localhost PORT=8080 WGET=/usr/bin/wget SVNLOOK=/usr/bin/svnlook # Don't change below this point ############################### REPOS="$1" REV="$2" UUID=`$SVNLOOK uuid $REPOS` echo "--------------------------------">>${REPOS}/post-commit.log # # Check if "[X] Prevent Cross Site Request Forgery exploits" is activated # so we can present a valid crum or a proper header BREAD_URL=
  • 为什么在检查特定分支是否已提交时,提交后钩子条件语句为什么不起作用?(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分支中还是在其他分支中,它都永远不会运行。 编辑:根据已回答此问题的反馈
  • 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进行操作,否则您会认为它在提交失败后一直有效,但在失败时无法执行预提交钩子
  • 使用 SVN post-commit hook 只更新已经提交的文件(Using SVN post-commit hook to update only files that have been committed)
    问题 我正在使用 SVN 存储库进行 Web 开发工作。 我设置了一个开发站点,其中包含对存储库的检出。 我已经设置了一个 SVN post-commit 钩子,以便每当对存储库进行提交时,开发站点都会更新: cd /home/www/dev_ssl /usr/bin/svn up 这工作正常,但由于存储库的大小,更新需要很长时间(大约 3 分钟),这在进行常规提交时相当令人沮丧。 我想要的是更改 post-commit 挂钩以仅更新那些已提交但我不知道如何执行此操作的文件/目录。 更新“最低公共目录”可能是最好的解决方案,例如 如果提交以下文件: /branches/feature_x/images/logo.jpg /branches/feature_x/css/screen.css 它会更新目录:/branches/feature_x/ 谁能帮我创建一个解决方案来实现这一目标? 更新: 存储库和开发站点位于同一台服务器上,因此不应涉及网络问题。 CPU使用率很低,I/O应该没问题(它在高规格的专用服务器上运行) 开发站点大约是。 7.5GB 大小,包含约。 600,000 项,这主要是因为有多个分支/标签 回答1 您可以使用svnlook dirs-changed和svn up -N来仅更新更改的每个文件夹的内容: cd /home/www/dev_ssl svnlook
  • 如何获得PHP中的Subversion版本号?(How can I get the Subversion revision number in PHP?)
    问题 我想让我的PHP应用程序标有它使用的修订号,但是我不想使用CruiseControl或更新文件并每次都上传它。 我该怎么办? 回答1 SVN关键字不是一个好的解决方案。 正如其他人指出的那样,在文件中添加$ Revision $仅会影响特定文件,该文件可能不会长时间更改。 记住在每次提交之前“编辑”文件(通过添加或删除空白行)是没有意义的。 您也可以手动输入修订。 做到这一点的一种好方法(我知道)是有一个自动化的部署过程(这总是一件好事)并使用命令svnversion。 这是我的工作: 每当需要修订的地方,我都会包含: <?php include 'version.php'; ?> <?php include 'version.php'; ?> 。 此“ version.php”文件仅具有修订号。 此外,它不是存储库的一部分(将被忽略)。 这是我创建它的方法: 1)在服务器上安装了SVN的项目中,我也将其用于部署。 将最新版本获取到服务器上我有一个脚本,该脚本除其他功能外还可以执行以下操作(该脚本在服务器上运行): cd /var/www/project svn update rm version.php svnversion > version.php 2)在未安装SVN的项目中,我的部署脚本更加复杂:它会在本地创建version.php文件,将代码压缩,上传并解压缩