簡體   English   中英

如何在PHP中獲取Subversion修訂版號?

[英]How can I get the Subversion revision number in PHP?

我希望我的PHP應用程序標有它使用的修訂號,但我不想使用CruiseControl或更新文件並每次上傳它。 我該怎么辦?

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文件,壓縮代碼,上傳並提取它

假設您的webroot是subversion樹的簽出副本,您可以解析/.svn/entries文件並掛出修訂號(此處為第4行)...

在PHP中:

$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);

這就是我開始工作的方式。 如果您的服務器設置為允許shell_exec並且您安裝了SVN,則運行:

$revision = `svnversion`;

要么

$revision = shell_exec('svnversion');

這個答案

您可以在代碼中的任何位置添加以下內容

$Id:$ 

所以例如Jeff做了:

<div id="svnrevision">svn revision: $Id:$</div>

當在服務器中檢查時,用當前版本號替換$ Id:$。 我也找到了這個參考

還有$ Date:$,$ Rev:$,$ Revision:$

現在遲到了,但是使用Subversion post-commit鈎子。 在存儲庫的hooks文件夾中,創建一個像這樣的shell腳本:

#!/bin/bash

REPOS="$1"
REV="$2"

cd /web/root
rm -f /web/root/templates/base.html
/usr/bin/svn update
/bin/sed -i s/REVISION/$REV/ /web/root/templates/base.html

此特定示例假定您的實時站點位於/ web / root中,並且開發代碼保存在其他位置。 當您提交dev更改時,腳本將刪除先前的實時模板(以避免沖突消息),運行更新並使用實際修訂號替換模板中REVISION的出現次數。

更多關於這里的鈎子

在大多數情況下,服務器上的代碼實際上包含代碼的“導出”,而不是結帳,因此不包含.svn文件夾。 至少那是我經常看到的設置。 其他人真的將他們的代碼檢查到Web服務器上嗎?

最簡單的方法是使用Subversion“關鍵字替換”。 有一個指導這里在SVN書( 版本控制使用Subversion )。

您基本上只需在文件中的某處添加文本$ Rev $。 然后在存儲庫中啟用關鍵字。 在結賬時,SVN會將修訂號替換為文件。

您可以通過SVN關鍵字了解情況 在要顯示修訂版本的位置添加$ Revision $,但這只會顯示特定文件更改的最后修訂版本,因此您每次都必須對文件進行更改。 如果沒有某種外部腳本或提交后掛鈎,則無法獲取全局修訂號。

你也可以這樣做:

$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
    echo 'Revision: '.$match[0];
}

請參閱我對類似問題“Mark”svn export with revision的回復。

如果在導出時捕獲修訂版號,則可以使用:

svn export /path/to/repository | grep ^Exported > revision.txt

要刪除除修訂號之外的所有內容,您可以通過此sed命令管道:

svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt
$svn_rev=file_get_contents('/path.to.repository/db/current');

執行此操作的另一種可能性是運行執行“部署過程”中描述的步驟的cron(假設它是* nix / FreeBSD服務器)。

如果性能是一個問題,那么你可以這樣做:

exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));

這當然取決於您是否已完成結賬以及svn命令的存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM