2010-09-17 231 views
3

我總是遇到svn:ignore的問題,但是這次我想我可能會嘗試一些不可能的事情。svn:忽略生成的子文件夾

假設目錄結構:

/ 
    /foo 
    /bar 
    /web 
     /uploads 
      /assets 
      /avatars 
       /fu 
        /*.jpg 
       /ba 
        /*.jpg 
       keepme.jpg 
       keepmetoo.jpg 

我想忽略化身目錄的所有子文件夾,但不是目錄(keepme.jpg,keepmetoo.jpg)的文件。

自動生成頭像子文件夾(fu,ba),並且名稱無法預先確定,因此需要完全忽略所有/頭像子文件夾。

這可能嗎?如何?

編輯我們不希望使用post-commit掛鉤。這只是一個偏好問題。我們有很多成熟的應用程序,並且已經開發出一套標準化的做事方式,並且提交掛鉤完全沒有被使用。我們簡單地寧願不添加任何不必要的附加運動部件。坦率地說,在考慮添加提交後掛鉤之前,我們更有可能解決目錄結構(這不是一項小任務)。

+0

如果您想引發一些興趣,請爲您的問題添加賞金。 – Will 2011-02-02 12:02:11

+0

@ulidtko:tbh這個問題真的很老,我不記得爲什麼它必須是這樣的具體。我會在早上更詳細地更新這個問題。至於VCS系統的尷尬使用,你是正確的,但是從內存來看,由於正在使用的框架和最初的實現,我們有一些目錄佈局限制。對不起,我不能更具體。 – xzyfer 2011-02-09 12:45:48

+0

請參閱http://stackoverflow.com/questions/4889375/svn-ignore-subfolders – 2013-11-14 10:01:19

回答

2

你想存儲整個很多的svn,除了/ avataurs/fu和avatars/ba(實際上所有的頭像/ xxx)?

您需要先將其餘的目錄結構添加到svn。使用Tortoise添加根目錄,取消選中不想添加的目錄,然後提交。解決了最初的問題 - 沒有犯下違規的子目錄,一切都很好。

除了下一個問題是,你不希望任何人'不小心'添加新生成的子目錄 - 在這種情況下,預先提交鉤子是必不可少的。它們確實非常簡單 - 你只需要編寫一個快速批處理文件或者perl腳本來對傳入文件的路徑執行aregex,並且返回1(如果有的話)包含".*/avatars/.*/.*"(這仍然允許將新文件添加到該目錄中) 。掛鉤還可以返回將要顯示給正在添加文件的用戶的文本。我使用一個來阻止文件被禁止列表中的文件擴展名(例如.obj等)。

如果化身的subdirs永遠不會成爲SVN,那麼你永遠不會檢查出來 - 顯然 - 你的工作已經完成!


這是我的pre-commit.cmd鉤子文件的副本。只要把它放到你的鉤子目錄(在窗口中),你就可以走了。

@echo off 

svnlook changed -t %2 %1 > c:\temp\pre-commit.txt 

findstr /G:"%1\hooks\ignore-matches.txt" c:\temp\pre-commit.txt > c:\temp\precommit-bad.txt 
if %ERRORLEVEL% NEQ 0 exit 0 

echo disallowed file extension >> c:\temp\precommit-bad.txt 

type c:\temp\precommit-bad.txt 1>&2 
exit 1 

忽略-matches.txt文件中包含這樣的線路:

^[^D].*\.obj$ 

任何條目相匹配的忽略,matches.txt文件意味着在提交被拒絕,用戶將不得不再試一次,這次是正確的。

+0

預提交鉤子是多麼便攜?我自己並不熟悉,所以對於這些問題需要遵循。鉤子腳本是否進入repo配置本身,或者是每個負責在本地簽出中設置鉤子的用戶。我問,因爲我們在Ubuntu上使用windows和commandline svn中的tortisesvn混合。 – xzyfer 2011-02-10 01:19:45

+0

他們是服務器端,回購配置類型的東西。看看你的repo,你會看到一個hooks目錄,其中已經有一些示例模板,只是等待被重命名爲可執行腳本。 http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html#svn.reposadmin.create.hooks – gbjbaanb 2011-02-10 13:12:51

1

簡而言之,僅配置純SVN這是不可能的。但是你有設置這些屬性的一些選項,並檢查它們,就像

  • 催谷你的頭像自動生成工具,
  • 調用批處理文件中自動生成後更新SVN設置,
  • 在提交之前調用批處理文件更新SVN設置。

在服務器端,您可以

  • 拒絕承諾在提交前的,如果他們不遵守規則,
  • 自動更新在提交後掛機的設置,
  • 或者需要智能開發人員並只需在CI系統中進行檢查。

首先,我會建議自動生成文件夾後自動更新svn:ignore屬性。最簡單的方法是在生成後調用批處理文件。該批處理文件本身是簡單的:

@echo off 
echo.>~svnignore 
dir /b /aD >~svnignore 
svn propset svn:ignore --file ~svnignore . 
del ~svnignore 

當然,文件~svnignore應該是你可以保證爲別的不使用的文件名。如果這是在生成時自動調用的,這應該適用於每個人。

其次,我會推薦檢查pre-commit鉤子中的完整性。在後期提交中做它可能是可以接受的,在持續集成系統中這樣做肯定會爲時過晚。

最後,你有另一種選擇,但我不會推薦走這條路:當你用tortoisesvn標記問題時,我假設你使用這個工具。這爲您提供了使用客戶端預提交鉤子的附加選項。爲此,進入TortoiseSVN設置對話框。在左側的樹中,您會找到一個條目掛鉤腳本,您可以在其中配置某些可執行文件(如批處理文件...),以便在特定時間執行,例如在預先提交時間。

這樣做的缺點是,你實際上打破了SVN的所有控制檯的使用,如果你想爲某些構建/標籤等進行一些自動化,這將是毫無價值的。

+0

我們在ubuntu shell中直接使用了tortisesvn和命令行,因此您注意到最後一個選項不可用。編輯svn:當運行自動生成時忽略不可行,要麼因爲這些目錄被刪除並且每天創建多次。不幸的是,無論開發人員多麼聰明,每個人最終都會犯錯誤:)我確實認爲pre-commit鉤子可能是要走的路。 – xzyfer 2011-02-10 01:12:55

+0

可移植性如何預先提交鉤子?我自己並不熟悉,所以對於這些問題需要遵循。鉤子腳本是否進入repo配置本身,或者是每個負責在本地簽出中設置鉤子的用戶。我問,因爲我們在Ubuntu上使用windows和commandline svn中的tortisesvn混合。 – xzyfer 2011-02-10 01:20:02

+1

首先,我想補充一點,每天多次運行「set-svn-ignore」腳本是沒有問題的 - 幾乎立刻就完成了。其次,鉤子腳本是服務器端的,是repo配置的一部分,並且是系統特定的(cmd vs.bash),但通過使用unix shell(並且在windows上使用mingw/msys/etc。)+ svnlook,系統特定部分變得無關緊要。我會把它留給@gbjbaanb,因爲他對我來說就是關注那個部分,並且已經有了一個例子。 – gimpf 2011-02-10 11:48:38