2012-01-10 114 views
2

我有以下問題。我需要組織自動上傳從svn倉庫部署服務器,但有一些特點。 還有就是我怎麼寫的:通過shell部署svn checkout

# $1 - project; $2 - version (optional) 
# rm -rf $projectDir 
if [ "$2" == '' ]; then 
    svn export $trunk $projectDir --force >> $log 
    version=`svn info $trunk | grep Revision | awk '{print$2}'` 
    svn copy $trunk $tags/$version -m "created while uploading last version of $1" 
    echo "New stable version #$version of $1 is created 
    Uploading to last version is completed successfully" 
else 
    version=$2 
    svn export $tags/$version/ $projectDir --force >> $log 
    echo "Revert to version #$version is completed successfully" 
fi 

echo $version > $projectDir/version 

chown -R $1:$1 $projectDir 

但SVN出口不刪通過svn文件刪除了,所以我需要在每次清潔後再出口目錄。這不好。 在此之前,我與結賬工作的部署是這樣的:

svn co $trunk >> $log 
cp -ruf trunk/* $projectDir 
svn info $trunk | grep Revision > $projectDir/version 
chown -R $project:$project $projectDir 
echo "uploading finished" 

這項工作非常好,非常非常快(它改變了只更改的文件),比出口,但:

  1. 沒有自動標籤創建;
  2. 沒有好機會恢復的機會。

在我最後一個腳本co不起作用,因爲它試圖從不同的存儲庫目錄(trunk/some tag)中檢出一個目錄,這是不真實的。

所以,問題:

  1. 我可以結帳前搬遷項目?
  2. 我可以在導出之前找到與版本和現有版本的差異嗎?
  3. 如何使用差異結果? (刪除導出後不需要的文件?)

在此先感謝。

+0

Shell放置在項目服務器中,但svn服務器是外部的。 – extempl 2012-01-10 07:10:17

回答

1

您評論了Capistrano?它可以做很多你想要達到的目標。

+0

我是Capistrano的新手,不熟悉Ruby,但看起來不太難。 但是,我是否需要爲簡單任務使用如此巨大的工具? 我的意思是說,Capistrano不會做我會做的任何其他動作。 >每次部署時,將在「releases」目錄下創建一個新目錄,並在其中放置新版本。然後,「當前」符號鏈接將更新爲指向該目錄。 因此,它不會工作得更快,因爲它每次都將整個項目上傳到不同的文件夾中,我可以用符號鏈接以相同的方式進行操作。 – extempl 2012-01-10 08:06:43

+0

在這種情況下,我需要的只是檢查目錄是否存在,如果不存在則導出。之後,只能更改符號鏈接源。 但是最簡單的方法嗎? – extempl 2012-01-10 08:18:30

+0

另外,還有一個時刻 - 即使文件沒有從上次導出更改,導出也會執行提交。這使得創建無限數量的重複版本成爲可能。結賬是所有部署的理想選擇,但我已經在上面描述了我的問題。 – extempl 2012-01-10 08:33:29