2012-08-01 55 views
4

我一直在這方面工作一段時間,但找不到解決方案(如果有的話)。SVN通過Windows和Linux機器上的Web窗體更新

所以問題:有沒有辦法通過HTML網頁表單做svn update請求?

我測試了多個基於Web的SVN客戶端(包括構建自己的客戶端),但他們都缺少更新的可能性。

我知道這是PHP使用的用戶權限問題,但即使我將我係統上的所有文件設置爲777(在虛擬機上嘗試過),仍然無法將其歸檔。

任何人都有這方面的經驗?

謝謝。

我也瀏覽了所有的目錄,並將所有者設置爲Everyone,並擁有完全訪問權限。現在不能有權限問題......我想。

Last edit: 看來我不能執行SVN如果腳本文件不在svn目錄的根目錄。最終的代碼現在看起來像這樣:http://codepad.org/Kb2K8e6m

+2

從您發表的評論如下:*「我不需要它是默認的最新版本,我希望可以隨時更新我的​​網站到任何修訂版本,並且只在需要它的時候。」*如果是這樣的話,那麼表單和SVN工作副本應該擁有所有相同的權限,因爲它們都被Apache用戶訪問,不是嗎?除非您沒有在文件上設置正確的所有者。 – netcoder 2012-08-03 14:37:07

回答

4

下面的函數應該或多或少的爲你做。它也打印出:

  1. 它是在外殼執行具體的命令
  2. 命令(包括錯誤)的輸出,使得它也可以調試。

function updatesvn() { 

    if (isset($_POST)) { 

     //Get svn username and password from request parameters 

     $username = <your_svn_username>; 
     $password = <your_svn_password>; 

     //Get version number to move to 
     $values = $_POST; 
     $version = $values['revision']; 

     //validate version number 

     //Path where you have checked out your project 
     $rpath = '/var/www/myproj'; 

     //Command to svn update 
     $cmd = "cd $rpath; svn cleanup; svn --non-interactive --username $username --password $password update -r $version 2>&1"; 

     echo $cmd; 
     $out = shell_exec($cmd); 

     echo $out; 
    } 
} 

編輯:當心這個代碼安全漏洞的情況。我在這裏簡化了它。我們在我們的一個應用程序中使用了它,在此應用程序中,達到此點的用戶已被預先認證爲Web應用程序的Admin用戶。此外,此代碼在MVC框架中執行,在控制器中執行操作之前,在中心位置對輸入進行驗證。

+0

您將用戶輸入直接傳遞給PHP命令行!您的腳本不驗證用戶輸入,並允許用戶在服務器上執行* any *命令。 – Dunhamzzz 2012-08-01 08:20:15

+0

@OzairKafray好吧,我終於有一段時間來測試這個:'cd c:\ data \ mysite.com \; svn cleanup; svn --non-interactive --username --password update -r 6'給我'系統找不到指定的路徑。' – Peon 2012-08-02 14:38:21

+0

好的,我編輯了這行。它在CLI中執行時非常完美,但它在「test.php」站點中作爲php腳本運行時不會輸出,也不會執行任何操作。這是它目前的樣子:http://i49.tinypic.com/288obis.png – Peon 2012-08-02 14:52:12

0

您是否在構建持續集成服務器?你爲什麼要讓任何Joe Bloggs更新你的本地存儲庫?

你必須在後端有一些代碼才能在shell中執行「svn update」。

一般來說,一個基於網絡的SVN客戶端可以直接進入SVN倉庫,並且默認情況下是最新的 - 它甚至應該讓你查看以前的版本和差異。

+0

我不需要它默認爲最新的。我希望可以隨時將我的網站更新爲任何修訂版,並且只在我需要時才**。 – Peon 2012-08-01 07:31:53

1

您可以使用PECL svn擴展中的svn_update()(或exec和命令行svn - 實際上沒有太大區別)。

我更喜歡權限問題的解決方案是將umask設置002對於誰將會更新所有用戶(包括www-data或任何你的網絡服務器用戶),把它們放到一個共同的phpuser組,設置組的根目錄工作副本(chgrp phpuser <rootdir> - 之前結帳!),確保它是組可寫的(chmod g+rwx <rootdir>)並將其設置爲setgid(chmod g+s <rootdir>),但如果您不關心保留文件權限,那麼當然chmod -R 777 <rootdir>要簡單得多。

+0

針對SVN的+1:PHP! – 2012-08-03 20:25:25

+0

1.不確定我想使用寫下的東西:「這個函數是實驗性的,在將來的PHP版本中,這個函數的行爲,它的名字和周圍的文檔可能會在沒有通知的情況下改變。你自己的風險。「 2.正如我已經說過,權限設置爲「每個人」w /完全訪問。 – Peon 2012-08-08 06:24:21

+0

@DainisAbols:我已經使用SVN:PHP沒有任何問題。如果我下次更新PHP時需要做些微的修改(通常每年會發生一次或兩次),我可以忍受這一點。我不會在生產中使用它,但是我無法想象爲什麼我會首先從生產代碼中調用SVN。至於權限,授予每個人的所有權利並不是很好(這是不安全的,如果你使用工作副本進行提交,它可能會混淆SVN中存儲的權限標誌),所以我試圖解釋你如何做得更好。當然,只有當你解決你的原始問題時,這纔是有意義的。 – Tgr 2012-08-08 09:20:00