2011-06-14 53 views
2

我們最近有一個問題,在切換SVN工作副本的過程中,TortoiseSVN或AnkhSVN(我無法確定哪個)崩潰。我們的開發人員並沒有意識到切換是不完整的,並且一切都很好,直到將分支合併回主幹,在那裏我們瞭解到一些變更已經提交給主幹,並且一些變更已經提交到分支。如何判斷SVN工作副本中的所有目錄是否位於同一個存儲庫根目錄?

幸運的是,這實際上並沒有影響任何東西,但我擔心這種情況可能會在將來再次發生,我需要一種快速的方法來測試工作副本中哪些子目錄指向的存儲庫。現在,在Linux中,我可以很快地破解一個shell腳本來確定這一點,但是我目前不知道如何在Windows中找到它。

如果我必須(並且放心,我會分享它,如果我這樣做),我並不完全反對使用SharpSVN一起黑客攻擊,但我想知道是否可以節省一些時間,在TortoiseSVN或AnkhSVN功能爲我做。

回答

3

如果你可以使用PowerShell使用類似如下:

gci -Recurse | ?{ $_.psIsContainer -eq $true} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:" 

對於每一個文件夾在你的工作拷貝,它會顯示路徑,並從回購的URL。如果某個文件夾切換到分支,您可以看到該URL和路徑。

您可以輕鬆地調整它來打印只屬於您的當前分支(或主幹)

忽略未版本控制的文件夾以外的路徑和URL很簡單:

(svn status $_.fullname) -notmatch "\?") 

所以整個事情將是:

gci | ?{ $_.psIsContainer -eq $true -and ((svn status $_.fullname) -notmatch "\?")} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:" 

您需要有一個命令行svn客戶端,如SlikSVN或CollabnetSVN和路徑。

+0

幾乎在那裏,當我想出如何將目錄與當前根進行比較並忽略未版本化的目錄時,我將編輯您的文章。 – 2011-06-14 16:39:53

+0

@Raskolnikov - 我已經更新過濾出未版本控制的文件夾 – manojlds 2011-06-14 17:09:48

+0

謝謝,我與win32svn一起工作 - http://sourceforge.net/projects/win32svn/ – 2011-06-16 08:32:03

1

如果您可以在Linux中創建腳本,您可能需要將cygwin放在客戶端上,以便您可以訪問bash腳本。或者,也許perl,因爲他們有自己的Windows安裝。 UnxUtils也相當不錯http://unxutils.sourceforge.net/

1

@manojlds答案是相當合理的,但我的測試很快顯示出一些問題。首先,雖然它正確地過濾掉了非SVN文件夾,但是它不是,而是處理孫子。 svn status命令在這樣的項目上有一個「不是工作副本」消息。請記住,Get-ChildItem不會因爲文件夾不是Subversion文件夾而停止從文件夾下潛;它注意到這個事實,但繼續挖掘,所以你也必須處理後代。

接着,在忽略項svn info命令梁木(即上的文件夾的屬性svn:ignore)該投訴「不是一個版本資源」

最後,它可以過濾掉太多:它是依靠svn status輸出一個問號開頭的行(表示未版本控制)當且僅當指定的文件夾實際上是在未版本控制。然而,由於svn status一個文件夾包括其後代的所有,如果任何後代項的版本控制目錄未受版本控制(文件或文件夾),svn status包括無版本狀態指示燈,問號,引起版本的文件夾,然後被條件錯誤地忽略。圖中的頂部窗格顯示,如果沒有未受版本控制的後代,則根的兩個孩子都會報告正常狀態。在將資源文件夾添加爲未版本控制的後代(底部窗格)後,svn status中的報告現在包含未版本控制的子代。

svn status includes all descendants

一個更好的解決方案可實現GET-EnhancedChildItem,可從我的開源CleanCode庫(cmdlet的從我的API bookshelf,開闢文檔PowerShell的音量,或者去下載鏈接獲取代碼)。這種增強GET-ChildItem已經知道如何分離版本的文件,以及如何只注重文件夾,所以你必須編寫的代碼要簡單得多(再加上它不會從上述缺點):

Get-EnhancedChildItem -Svn -Recurse -ContainersOnly | 
    % {svn info $_.fullname} | 
    select-string -Pattern "^(PATH|URL):" 

–ContainersOnly選項使該過濾器隔離文件夾,就像前面的代碼所做的:

filter FilterContainersOnly() 
{ 
    if ($_.PSIsContainer) { $_ } 
} 

–Svn選項啓用此過濾器可以解決前面的代碼的不足之處:

filter FilterSvn() 
{ 
    # Check just the current item (depth => empty); 
    # force it to report even if up-to-date (verbose => true); and 
    # wrap stderr into stdout (2>&1) for the next step. 
    $svnStatus = (svn status --verbose --depth empty $_.fullname 2>&1) 

    # Item is non-Svn with status of "?" (unversioned) or "I" (ignored). 
    # Descendants, which are still traversed, cause "svn status" to fail, 
    # and those of course are also non-Svn. 
    $svnFilter = ($svnStatus -notmatch "^[?I]|is not a working copy") 

    if ($svnFilter) { $_ } 
} 
+0

非常感謝您的迴應,儘管主題的年齡。我實際上並沒有使用SVN(因爲我已經被Mercurial的這種甜蜜的警笛稱爲不可能發生這種問題的誘惑),但是你的迴應似乎很有幫助。希望這對希望解決這個問題的其他人有幫助。 – 2011-11-24 00:24:52

相關問題