![](/img/trans.png)
[英]Find all files except those which is under version control systems (git or SVN)
[英]SVN: find files updated to nonexistence
我正在編寫一個Shell腳本,該腳本可以存儲SVN工作副本的實際狀態,並在以后完全恢復它的狀態。 目前,我對文件和目錄的修訂的特定的,罕見的組合存在問題,這似乎是無法檢測到的。
假設有一個帶有兩個修訂版的存儲庫。 有兩種情況:
假設foo
是僅存在於修訂版2中的文件(或目錄)。首先,整個工作副本位於修訂版2中。然后, foo
(且僅foo
)更新為修訂版1。
假設bar
是僅存在於修訂版1中的文件(或目錄)。首先,整個工作副本位於修訂版1中。然后, bar
(僅bar
)更新為修訂版2。
兩種情況都非常相似,但似乎有不同的解決方案。 在這兩種情況下,文件(或目錄)都將消失。 但是,命令svn status
輸出不包含有關此信息。
如何通過Shell腳本創建此類文件和目錄的列表?
有一個簡單但不好的解決方案。 可以使用svn list
命令獲取當前版本中應該存在的文件列表,並將其與實際存在的文件列表進行比較。
該解決方案是不可接受的,因為它要花費大量時間,並且會給服務器帶來大量流量。
我發布了我能想到的最佳答案。 盡管如此,它僅適用於第一種情況,並且具有假陽性。
我曾經嘗試做與您正在做的相同的事情,但是我遇到了很多極端的情況,最終我轉向了完全不同的方向。 我沒有使用腳本,而是使用了本地git存儲庫。
從Subversion存儲庫中簽出工作副本,然后使用git init
在該文件夾中創建本地git存儲庫。 使用git add
和git commit
將Subversion工作副本的全部內容添加到git存儲庫- 包括 .svn
元數據目錄。 Git現在跟蹤您的工作副本以及與其相關聯的所有Subversion元數據。 我當前的git存儲庫具有5個不同的分支,每個分支基於不同的Subversion版本,並且包含尚未提交到Subversion存儲庫的不同更改集。 git存儲庫使它們之間的來回切換變得容易,並且Subversion就像它們都是單獨的工作副本一樣工作。 即使對於大型工作副本,git也可以有效地存儲內容並在分支之間快速切換。
請注意,這與git svn
命令不同,后者是git直接與Subversion存儲庫接口的方法。 我發現git svn
的使用更復雜,更容易出錯。 將普通的Subversion工作副本包裝在git存儲庫中,使我仍然可以使用Subversion執行所有存儲庫操作,並且只需要我學習一些基本的git命令( add
, commit
, branch
, checkout
等)。 對於有Subversion經驗和git新手的人來說,這要容易一些。 git svn
更適合於對git有經驗並且受Subversion存儲庫困擾的人。
我發現第一種情況的部分解決方案。
svn status -u | grep '^........\*........ ' | cut -c 22-
此代碼顯示了頭部修訂版中存在的所有文件,而當前版本中不存在。 這將從第一種情況中查找文件和目錄。 但是,當將父目錄(仍然存在)更新為較低版本時刪除文件時,它將生成假陽性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.