簡體   English   中英

刪除不必要的 svn:mergeinfo 屬性

[英]Remove unnecessary svn:mergeinfo properties

當我在我的存儲庫中合並東西時,Subversion 想要添加/更改很多svn:mergeinfo屬性到與我想要合並的東西完全無關的文件中。

之前在 Stack Overflow 上已詢問過有關此行為的問題:

根據我對上述主題的理解,我的存儲庫中的很多文件似乎都有明確的svn:mergeinfo屬性,而實際上它們不應該。 建議是減少數量,僅將這些屬性放在相關文件/文件夾中。

所以現在我的問題是:如何輕松刪除那些不需要的屬性? 我正在使用 TortoiseSVN,但我不願意手動檢查/修復數百個文件。 有沒有更簡單的方法來刪除那些不必要的svn:mergeinfo屬性?

PS 我不是在尋找 C++ SVN API 代碼。

這是刪除所有子樹 svn:mergeinfo 屬性但不在根文件夾中的另一種方法(這是分支正常工作所必需的)。

從項目的根目錄執行:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

這是一種刪除所有子樹 svn:mergeinfo 屬性的方法。 在存儲庫的根目錄中運行它:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

一站式輕松復制/粘貼:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

要在運行之前預覽這將影響哪些文件,請將最后一個“propdel”更改為“propget”或完全刪除最后一個 xargs 管道。

正如這個線程中提到的:

  • 大多數空的合並信息(“空白”)可能是由於源項目沒有明確的合並信息的工作副本到工作副本副本/移動引起的。 除非您使用 1.6 SVN,否則使用 propdel 可能是解決方案:從 1.5.5 開始,這些 WC-to-WC 副本不再在目標上創建空的 mergeinfo
  • 較早的 svn move (rename) 重組操作也可以傳播 mergeinfo,而不是將它們留在根目錄中
  • 有一個潛在的內存問題,由案例 3393跟蹤,將在即將發布的 1.6.2 版本中修復並在 1.5 中向后移植

由於我對盲目svn:merge-info屬性刪除沒有信心,我已經實現了一個工具來分析工作副本的當前情況,並從非根合並信息屬性中刪除盡可能多的合並修訂。 在額外的人工檢查和控制之后,可以提交對工作副本的更改。

這里是: svn-clean-mergeinfo

不要猶豫,報告有關其使用的任何問題以改進它。

Subversion 1.10 引入了一個專用於該任務的新工具: svn-mergeinfo-normalizer

我知道已經有一段時間了,但我遇到了類似的問題。 我正在使用 TortoiseSVN 1.6.7。 碰巧該屬性位於我的工作副本的根目錄上。 當我查看根目錄上的屬性並單擊 svn:mergeinfo 上的刪除時,它詢問我是否要遞歸刪除它。 這擺脫了我所有的 svn:mergeinfo cockups。

如果您確定要批量刪除 mergeinfo 屬性,可以使用以下 BASH 腳本。

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

它獲取已更改文件的列表,將其過濾為僅合並信息更改,刪除除實際文件路徑之外的所有內容,將每行路徑轉換為空格分隔列表,然后在該列表上恢復調用。

除了盲目地刪除 mergeinfo 屬性,還可以完成“丟失”的合並。

從根文件夾復制 mergeinfo 屬性,然后對子文件夾執行合並以獲取適當的相對路徑和完全相同的修訂列表。 (您可以但不需要僅列出此列表與子文件夾中已有的列表之間的差異。)

通常,此合並最終應該只更改 mergeinfo 屬性,而不是任何實際文件。 (如果它最終改變了文件,那么之前的合並之一一定只是部分合並,這可能已經給你帶來了問題。)

一旦你讓它們完全匹配,這樣做應該最終會為你刪除 mergeinfo 屬性。 您可能還需要執行相反的操作:將僅存在於子文件夾中的任何合並修訂合並到根目錄中(同樣,您可以粘貼完整列表並讓 SVN 為您找出差異)。

要在目錄結構中進行更改,這將是(僅非 DOS 'find'):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

運行連接到 1.5 服務器的 1.6.12 客戶端,我有類似的問題; 項目中一個子目錄需要它自己的 svn:mergeinfo,但是有 121 個這樣的條目(包括 ./var 下面的 5 個目錄,帶有“svn:ignore *”)似乎有點不合適。 因此,最好有一個(例如 Python)腳本,它能夠刪除明顯多余的合並信息並講述其他差異......

從存儲庫的根目錄運行以刪除 svn:mergeinfo 屬性:

  • Bash 命令: svn propdel -R -q svn:mergeinfo `svn ls`
  • PowerShell 命令: svn propdel -R -q svn:mergeinfo (svn ls)

此命令的好處:

  1. 它處理子樹,但不處理根目錄;
  2. 它處理隱藏(“點”)文件;
  3. 它會忽略不受版本控制的文件。

PS。 如果您在根目錄中提交了名稱中包含空格(或其他不尋常符號?)的文件,命令可能會失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM