@manojlds答案是相當合理的,但我的測試很快顯示出一些問題。首先,雖然它正確地過濾掉了非SVN文件夾,但是它不是,而是處理孫子。 svn status
命令在這樣的項目上有一個「不是工作副本」消息。請記住,Get-ChildItem不會因爲文件夾不是Subversion文件夾而停止從文件夾下潛;它注意到這個事實,但繼續挖掘,所以你也必須處理後代。
接着,在忽略項svn info
命令梁木(即上的文件夾的屬性svn:ignore
)該投訴「不是一個版本資源」。
最後,它可以過濾掉太多:它是依靠svn status
輸出一個問號開頭的行(表示未版本控制)當且僅當指定的文件夾實際上是在未版本控制。然而,由於svn status
一個文件夾包括其後代的所有,如果任何後代項的版本控制目錄未受版本控制(文件或文件夾),svn status
包括無版本狀態指示燈,問號,引起版本的文件夾,然後被條件錯誤地忽略。圖中的頂部窗格顯示,如果沒有未受版本控制的後代,則根的兩個孩子都會報告正常狀態。在將資源文件夾添加爲未版本控制的後代(底部窗格)後,svn status
中的報告現在包含未版本控制的子代。
一個更好的解決方案可實現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) { $_ }
}
幾乎在那裏,當我想出如何將目錄與當前根進行比較並忽略未版本化的目錄時,我將編輯您的文章。 – 2011-06-14 16:39:53
@Raskolnikov - 我已經更新過濾出未版本控制的文件夾 – manojlds 2011-06-14 17:09:48
謝謝,我與win32svn一起工作 - http://sourceforge.net/projects/win32svn/ – 2011-06-16 08:32:03