2012-03-05 24 views
5

對於一些晦澀難懂(但有效)的原因,我需要找出一個文件是否已經在我們的倉庫中進行過版本控制。如何查找一個文件是否曾經存在於svn-repo中?

我只找到獲取日誌中包含目錄,然後分析它刪除的條目的彎路:

svn log -v a/b/|grep " D .*a/b/c.xml" 

它的工作原理,但感覺「不乾淨」,有點脆弱。

+0

svn log -q -v | grep文件名| wc -l – 2012-03-05 11:49:13

回答

4

根據你的問題,你隱含地限定你的請求到刪除文件(因爲假設它沒有被刪除,簡單的目錄搜索會顯示它)。懶獾的評論是值得的:取消資格不失去任何準確性,從而簡化命令。我都贊成簡化,但考慮到任何問題,我也希望考慮以較少的額外成本獲得更多解決方案。

於是開始與你提出的解決方案:

svn log -v a/b/ | grep " D .*a/b/c.xml" 

我會先加-q選項,它減少了輸出,你只是丟棄反正:

svn log -v -q a/b/ | grep " D .*a/b/c.xml" 

然後,我會想知道不僅僅是是否有這樣一個文件刪除,但也它被刪除(即在哪個版本)。既然你也隱含勝任您的環境中的Unix/Linux,這裏是使用awk溶液(改編自該blog entry):

svn log -q -v a/b/ | awk ' 
    /^r[0-9]* \|/ { REVISION=$1; } 
    /D/ { print REVISION": "$0; } 
' | grep " D .*a/b/c.xml" 

,當使用的–v參數工作,因爲svn log輸出的格式:它報告修訂後跟隨該修訂中的所有文件。下面是示出該文件Page.cs在修訂版本10506刪除一個例子:

r10506 | msorens | 2011-02-14 12:58:56 -0800 (Mon, 14 Feb 2011) | 1 line 
Changed paths: 
    A /Projects/Test/Common 
    A /Projects/Test/Common/Setup.cs 
    A /Projects/Test/Common/Utility.cs 
    D /Projects/Test/Page.cs 

上述解析輸出的AWK命令以這種格式中提取從頂部行中的修訂號然後標記的任何文件爲已刪除(以下簡稱「d 「線)。對於Windows,PowerShell中使用switch語句提供相同的功率和易用性爲AWK的:

$(switch -Regex (svn log -q -v a/b) { 
    '^(r[0-9]*) \|' { $rev = $Matches[1] } 
    '^ D\s+(.*)' { "{0,-6} {1}" -f $rev, $Matches[1] } 
}) | Select-String "a/b/c.xml" 

但有與TortoiseSNV一個更簡單的方法---只需打開日誌窗口上你的工作的根複製並在搜索框中輸入文件名稱。修改列表立即按您輸入的內容進行過濾。如果它顯示多行輸出,則最新(最高)版本將始終是文件被刪除的版本。

0

感謝@邁克爾Sorens答案,我得到這個工作

在我來說,我需要了解哪些文件,其中一個文件夾./assets/gfx

去除。這裏是爲bash shell的代碼在一個班輪一旦你的輸入設置,每一行是一個命令行和「mysearchstr」是一個VAR組入殼

mysearchstr=assets/gfx/ 
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; }/D/ { print REVISION": "$0; }' | grep menu 

只是想分享我如何組織這個解決方案。這是對原始答案的重新考慮..但也許對某人使用簡潔的代碼塊,容易複製,並重申實際的解決方案答案(但有人實現它)實際上是正確的

相關問題