2009-08-28 30 views
1

首先,我不確定這是甚至可能的,但是我需要知道它是如何完成的,如果不是,爲什麼不呢?SVN - 如何攔截,修改或添加預先提交的文件?

我想創建一個C#應用程序,它在Subversion存儲庫的提交過程中的相應時間運行(預先承諾我相信),然後將添加另一個文件提交。

例如,我對Program.cs和Main.cs進行了更改,但不是 AssemblyInfo.cs。我希望能夠對AssemblyInfo.cs或任何文件進行更改。

我使用SharpSVN編寫了一個控制檯應用程序,它在提交後觸發,然後替換了一個文件,但是這導致了修訂號的增加。顯然這並不理想。

我隨後發現SvnLookClient內上運行SharpSVN預提交,並已開始寫東西,但進入了死衚衕,當我意識到CopyFromPath並不意味着我的預期:

using (SvnLookClient client = new SvnLookClient()) 
    { 
     SvnLookOrigin o = new SvnLookOrigin(@"\\server\repository"); 
     SvnChangedArgs changedArgs = new SvnChangedArgs(); 
     Collection<SvnChangedEventArgs> changeList; 
     client.GetChanged(o, changedArgs, out changeList); 
    } 

或者,我會在C#之外解決這個問題,但理想情況下我希望在C#控制檯應用程序中這樣做,這樣我也可以告訴我的存儲庫服務器執行其他任務,如在數據庫腳本中運行等。

+0

爲什麼你想強制改變一個沒有改變的文件? – bluebrother 2009-08-29 09:51:26

+0

正常情況下,您想傳遞可以通過SvnHookArguments類獲取的SvnLookOrigin,而不僅僅是SvnLookOrigin(@「...」),因爲它看起來在HEAD。雖然你可能想看看當前的交易。 – 2009-09-26 07:07:33

回答

9

您不能在鉤子腳本期間修改事務。您可以使用消息(stderr will be sent to the client)拒絕提交,也可以在提交後的單獨提交中執行。

[編輯] 我想澄清爲什麼修改交易是一個壞主意(SVN-技術上):

客戶端不知道這件事。

除了「OK」,「FAILED」和stderr輸出,在提交期間沒有從服務器到客戶端的反向信道。

當客戶端提交其更改並且提交報告成功時,它會將其本地文件和文件夾狀態標記爲與版本庫版本[xyz]同步。例如,當你稍後改變一些東西時,它會在本地添加文件,它想要提交這些改變,但是然後......呃,你可以試着知道會發生什麼,我希望沿着「校驗和錯誤」或「文件已經添加」 。根據更改的類型,您可能沒有更好的機會獲得工作WC,而不是刪除文件夾並重新檢查損壞部分。

這是技術部分。現在開發人員方面:首先,自動修正正確的修改看起來很聰明,但它會失敗,因爲一個簡單的事實,即如果源代碼是可預先計算的,我們就不必讓它由開發人員編寫它。你希望你的開發者做正確的事情。

這最好的教育:他們必須知道什麼是正確的事情。採取好的措施讓他們知道一些事情,除了好的老式訓練之外,還要給他們反饋。

來自svn服務器的錯誤消息,破解構建或單元測試後的自動郵件,靜態源代碼分析工具的結果等,也可以作爲一種很好的教育工具。

我會推薦使用繼續集成,並在那裏驗證源代碼樹。這具有以下優點:開發人員在長時間工作後不會被阻止進行更改,但您仍然知道源代碼樹的狀態。

而且,我現在只是猜測你想要達到的目標:服務器端源代碼樹應該始終是「功能性」的。然後問題是,即使在自動修復文件,預先提交單元測試,樣式檢查以及其他任何情況下,最後仍然需要通過舊式系統測試來檢查程序是否真正起作用。所以基本上,你並沒有真正獲益。

技術可以支持流程,經過深思熟慮的工具可以很好地支持流程,以下流程實際上可以幫助開發人員節省時間並簡化工作流程。但是技術通常不能代替過程,並且它不能代替人類智能(至少現在)。 [/編輯]

+0

我知道你可能不應該,但可以這樣做嗎? – GenericTypeTea 2009-08-28 16:08:30

+0

我曾經讀過SVN目前並沒有強制它,但它可能會在未來的版本。 – gimpf 2009-08-28 16:11:04

+0

順便說一句,我知道你可以通過C-API和svn控制檯程序來完成它們(它們可以像修訂版一樣處理txns)。不過,不要這樣做。真。 – gimpf 2009-08-28 17:13:19

相關問題