[英]How can I get the Subversion revision number in PHP?
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');
現在遲到了,但是使用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.