2011-12-04 168 views
0

我的svn repo是/ home/httpd/svn/project。工作副本是/ home/httpd/svn/project_work。我正在運行更新工作副本的提交後腳本,然後與測試站點進行rsyncs更新。這工作正常。刪除從svn工作副本目錄中刪除

但我需要從工作拷貝目錄中刪除已刪除的文件。我知道,如果我在我的工作拷貝是目前這個腳本的工作原理:

SVN狀態| grep'^!' | sed's /! * //'| xargs的-I%SVN RM%

但我的後腳本在SVN /鉤目錄下運行。如何告訴上述命令對工作副本目錄中的文件進行操作,以便它可以成爲我的提交後腳本的一部分?

我的劇本是這樣的:

$SVN update $HOST/$SITE_WORK --non-interactive --username xxxxx --password xxxx >> $LOG 
$RSYNC -azv --exclude=.svn $HOST/$SITE_WORK/* /home/httpd/sites/$SITEDIR/doc-root >> $LOG 

回答

1

我會建議你看一看Jenkins。詹金斯是一個連續的構建系統,但它也非常適合完成這種類型的任務。

我會建議爲你在做什麼有點不同 - 特別是如果你正在談論的httpd:

  • 做一個SVN出口到一個新的工作目錄。這是乾淨的,不包括.svn目錄(儘管SVN 1.7並沒有像早期版本那樣將它們粘貼到任何地方)。
  • 導出完成後,將舊的工作目錄重命名爲臨時名稱。
  • 用舊工作目錄的名稱重命名新工作目錄。
  • 刪除舊的工作目錄。

這將防止您的工作目錄處於不一致的狀態,在同一時間目錄樹中新舊版本的文件同時存在。另外,這是自我恢復。如果由於某種原因舊更新沒有完成,新的構建將使所有事情都再次合適。

通過使用Jenkins在檢測到新的Subversion版本時執行此操作,您不再需要提交後掛鉤。問題是,在提交後掛鉤正在運行時,你的用戶必須坐在辦公桌前擺弄他們的拇指,等待Subversion在post-commit工作中傳遞一些信息。另外,您可以隨時按重建按鈕重建工作目錄,以防出現問題。


下面是它如何工作:

  • 用戶提交他們的更改。沒有提交後掛鉤。用戶立即看到他們的變化是否良好。
  • Jenkins看到更改,並在服務器上執行svn export以創建新的工作目錄。
  • Jenkins檢測到svn export成功,然後將舊的工作目錄移動到另一個名稱,將新的工作目錄重命名爲舊的位置,然後(可選)刪除舊的工作副本。舊的工作目錄永遠不會處於不一致的狀態。
  • Jenkins可以在發生更改時發送電子郵件。詹金斯可能還會運行一些煙霧測試來檢查代碼是否正確,如果檢測到問題則不做更新。
+0

Will Jenkins與Coda?這就是我們都用於開發的原因。 –

+0

當Jenkins在服務器端工作時,Coda是開發環境。詹金斯是一個構建系統,你不需要構建它。但是,您可以使用Jenkins進行跟蹤更改,測試,語法檢查以及最重要的部署和打包等事情。用一點點的潤滑脂,你可以讓詹金斯驗證HTML/CSS語法,並且所有的網頁鏈接都是有效的。 –

1

這是不可能的SVN服務器發送到在客戶端上執行的命令。如果你願意,你可以在每個客戶端上使用svn來運行svn和自定義腳本。當他們這樣做svn upsvn rm <filename>刪除

此外,文件在所有客戶端刪除。

從你的劇本我看,你發現所有的狀態行開始!這表明你已經改變了你的工作副本而不使用svn。來自manual

'!'
缺失項目(例如,您未使用svn移動或刪除它)。此 還表示目錄不完整(結帳或更新 已中斷)。

這聽起來像您或您的用戶正在做的事情是錯誤的。

編輯:這是關於刪除文件的一個測試階段的成績單:

我已經簽出存儲庫分成兩個工作拷貝,他們被稱爲SOF和SOF2我的磁盤上。
在sof上我已經添加了aFile.txt並提交了它。在sof2上,我剛剛檢出了該文件。這是現在的樣子:

$ svn info aFile.txt 
Path: aFile.txt 
Name: aFile.txt 
URL: http://xp-dev.com/svn/sof/trunk/aFile.txt 
Repository Root: http://xp-dev.com/svn/sof 
Repository UUID: d3d45886-b759-4dae-a297-3c88720da0c3 
Revision: 2 
Node Kind: file 
Schedule: normal 
Last Changed Author: wederbrand 
Last Changed Rev: 2 
Last Changed Date: 2011-12-05 19:53:11 +0100 (Mon, 05 Dec 2011) 
Text Last Updated: 2011-12-05 19:53:37 +0100 (Mon, 05 Dec 2011) 
Checksum: e5bc1e83330bccc8efe0e884b79a1c43 

現在,我要刪除它SOF

$svn rm aFile.txt 
D   aFile.txt 
$ svn commit -m'file deleted' 
Deleting  trunk/aFile.txt 

Committed revision 3. 
$ l 
<no files left in directory> 
$ svn info aFile.txt 
aFile.txt: (Not a versioned resource) 

和文件已經一去不復返了,現在到哪裏SOF 2,我要得到最新的更新

$ l 
total 8 
-rw-r--r-- 1 raven staff 36 Dec 5 19:53 aFile.txt 
$ svn up 
D aFile.txt 
Updated to revision 3. 
$ l 
<no files shown, it has been deleted> 

如果你得到任何其他行爲比這個東西是很奇怪:)

+0

我實際上沒有使用上面的腳本,我從另一篇文章中發現它。當我使用我的客戶端通過svn發佈包時,運行後提交腳本會更新工作副本,然後將工作副本與測試站點同步。當我在客戶端上刪除一個文件(使用svn)時,它會從我的本地驅動器中刪除,從存儲庫中刪除,但仍保留在工作副本中。我需要一些腳本能夠的命令,將從工作目錄中刪除所有svn刪除的文件。 –

+0

我認爲你不知何故錯過了,看看我的編輯。 –

+0

感謝您的編輯。我認爲問題在於我正在使用coda來編輯mac。當我在尾聲中刪除時,它將文件標記爲刪除,當我提交時,文件將從本地磁盤中刪除並從回購中刪除。然後,提交後腳本執行更新,但不是rm。這就是爲什麼我正在尋找一個rm行來添加到我的提交後腳本。我的腳本如下所示: $ SVN update $ HOST/$ SITE_WORK - 非交互式 - 用戶名xxxxx - 密碼xxxx >> $ LOG $ RSYNC -azv --exclude = .svn $ HOST/$ SITE_WORK/*/home/httpd/sites/$ SITEDIR/doc-root >> $ LOG –