当我提交到存储库时,我收到以下错误:
post-commit hook failed (exit code 255) with no output.
提交后代码如下:
@echo off
setlocal enableextensions
set REPOS=%1
set REV=%2
set TEMPFILE=C:TEMP%REV%.txt
set LOGFILE=D:svnlogsmysitepost_commit.log
set MANTIS_PATH="D:homemantis"
"C:Program FilesSlikSvnbinsvnlook" author %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt
"C:Program FilesSlikSvnbinsvnlook" date %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt
"C:Program FilesSlikSvnbinsvnlook" changed %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt
echo revision:[%REV%] >> %TEMPFILE% 2>>C:TEMPerr.txt
"C:Program FilesSlikSvnbinsvnlook" log %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt
date /T >> %LOGFILE% 2>>C:TEMPerr.txt
time /T >> %LOGFILE% 2>>C:TEMPerr.txt
D:wampbinphpphp5.3.0php.exe %MANTIS_PATH%scriptscheckin.php < %TEMPFILE% >> %LOGFILE% 2>>C:TEMPerr.txt
- 如您所见,有大量的错误日志记录,但错误日志永远不会被填充(除非我输入明显的错误,例如缺少路径)
- 开发和实时环境都是 Windows
- 似乎出现错误的行是最后一行 - 调用 PHP 的地方。当我把它拿出来时,提交工作没有问题
- 当我在命令行上手动运行它时,它可以工作并且不显示任何(明显的)错误。默认情况下,Afaik svn 在 SYSTEM 下运行,该用户足够高, 不必担心
正如您可能已经发现的那样,这是将我的SVN签入与Mantis错误跟踪器联系起来。有趣的是,PHP脚本正在执行,即注释被添加到错误中并且问题的自动关闭正在工作。由于某种原因,它似乎出错了。
我正在使用TortoiseSVN提交,但是使用命令行(SlikSVN)我得到了相同的输出:
svn ci -m "this is a test" test.txt
Sending test.txt
Transmitting file data .
Committed revision 1337.
Warning: post-commit hook failed (exit code 255) with no output.
Mantis的签入.php看起来像这样(为了可读性,删除了一些一般性评论):
#!/usr/bin/php -q
<?php
global $g_bypass_headers;
$g_bypass_headers = 1;
require_once( dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'core.php' );
# Make sure this script doesn't run via the webserver
if( php_sapi_name() != 'cli' ) {
echo "checkin.php is not allowed to run through the webserver.n";
exit( 1 );
}
# Check that the username is set and exists
$t_username = config_get( 'source_control_account' );
if( is_blank( $t_username ) || ( user_get_id_by_name( $t_username ) === false ) ) {
echo "Invalid source control account ('$t_username').n";
exit( 1 );
}
if( !defined( "STDIN" ) ) {
define( "STDIN", fopen( 'php://stdin', 'r' ) );
}
# Detect references to issues + concat all lines to have the comment log.
$t_commit_regexp = config_get( 'source_control_regexp' );
$t_commit_fixed_regexp = config_get( 'source_control_fixed_regexp' );
$t_comment = '';
$t_issues = array();
$t_fixed_issues = array();
while(( $t_line = fgets( STDIN, 1024 ) ) ) {
$t_comment .= $t_line;
if( preg_match_all( $t_commit_regexp, $t_line, $t_matches ) ) {
$t_count = count( $t_matches[0] );
for( $i = 0;$i < $t_count;++$i ) {
$t_issues[] = $t_matches[1][$i];
}
}
if( preg_match_all( $t_commit_fixed_regexp, $t_line, $t_matches ) ) {
$t_count = count( $t_matches[0] );
for( $i = 0;$i < $t_count;++$i ) {
$t_fixed_issues[] = $t_matches[1][$i];
}
}
}
# If no issues found, then no work to do.
if(( count( $t_issues ) == 0 ) && ( count( $t_fixed_issues ) == 0 ) ) {
echo "Comment does not reference any issues.n";
exit( 0 );
}
# Login as source control user
if( !auth_attempt_script_login( $t_username ) ) {
echo "Unable to loginn";
exit( 1 );
}
# history parameters are reserved for future use.
$t_history_old_value = '';
$t_history_new_value = '';
# add note to each bug only once
$t_issues = array_unique( $t_issues );
$t_fixed_issues = array_unique( $t_fixed_issues );
# Call the custom function to register the checkin on each issue.
foreach( $t_issues as $t_issue_id ) {
if( !in_array( $t_issue_id, $t_fixed_issues ) ) {
helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, false ) );
}
}
foreach( $t_fixed_issues as $t_issue_id ) {
helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, true ) );
}
exit( 0 );
我通常建议不要对 Subversion 钩子使用批处理脚本。有大量免费的开源脚本语言,它们功能更强大,更易于使用。哎呀,我什至不使用 BASH 作为钩子脚本。
尤其如此,因为钩子脚本只需要在服务器上运行,而不必在其他任何地方运行。这意味着您只需要在单个平台上工作即可。
话虽如此,您需要进行一些调试。钩子脚本通过svn commit
命令行失败。这意味着这不是与有关的问题。这是一个钩子脚本问题。由于这是一个 post hook 脚本,请尝试从命令行运行脚本本身,并从命令行将存储库和修订传递给它:
C> post-commit C:reposmy_repo 2323
这行得通吗?
问题是你没有在STDERR
上打印任何东西,所以Subversion没有任何东西可以打印。您正在文件中捕获 STDERR。删除2>>C:TEMPerr.txt
,以便您可以看到错误输出。在 Python、BASH 和 Perl 中,我可以捕获 STDERR,并且仍然可以将其打印出来,但我不确定如何在 Batch 脚本中执行此操作。
这将允许您查看错误输出,并可能帮助您确定脚本失败的位置。它在调用您的 PHP 脚本之前是否失败?你的PHP脚本中发生了什么吗?你所做的假设不一定有效吗?
另外,不要只在你的PHP钩子中echo
东西。Subversion 不会在STDOUT
上打印任何内容,无论钩子是成功还是失败。使用fputs(STDERR, 'My Error Message');
而不是echo
或print
。这会将您的错误消息发送到 STDERR,如果您的钩子脚本失败,Subversion 将打印出来。
希望这有帮助。
我也遇到了这个问题。确保脚本文件权限设置为"可执行文件"。