對於我們的項目,我們避免在用戶的svn配置文件中使用svn global-ignores
,因爲這些svn設置僅限於客戶端,並且不是項目的屬性。我們想要一種方法來管理項目子目錄中使用類似.gitignore
文件的忽略文件。我開發了一個簡單的方案,該方案使用.svnignore
文件與腳本(1)在目錄樹中查找.svnignore
文件並(2)更新在其中找到.svnignore
文件的每個目錄中的svn:ignore
屬性。當有人更新文件時,他們只需要記住運行腳本;我們發現這比手動管理目錄上的svn:ignore
屬性更容易。有沒有更好的方法來處理項目的svn:ignore列表?
下面是腳本:
#!/bin/sh
# Syntax of the .svnignore file: like what "svn propset svn:ignore" accepts,
# and in addition, lines in the .svnignore file that begin with a pound sign
# (#) are ignored so that one can put comments in the file.
find $1 -depth -name .svnignore | while read file ; do
dir="`dirname $file`"
egrep -v '^[ ]*#' $file | svn propset svn:ignore -F - $dir
svn update $dir
svn commit --depth=immediates -m"Updated list of ignored files." $dir $dir/.svnignore
done
echo "Done."
下面是該腳本接受了.svnignore
文件的例子:
# WARNING: This .svnignore file is not understood by SVN directly.
# WARNING: It is meant to be used in conjunction with our script in
# WARNING: trunk/project/scripts/svn-update-from-svnignore.sh
autom4te.cache
Makefile
config.log
config.status
.deps
include
TAGS
CTAGS
*.o
我的問題是:
- 有沒有更好的方式來完成相同的事情?
- 您在這裏看到的方法或腳本中是否存在危險?
感謝您的任何提示。
謝謝!解釋:1)如果你試圖提交目錄的屬性,但你的副本不是最新的,svn抱怨 - 因此需要svn up。2)單個提交的目標是減少意外地對與.svnignore更改不相關的子目錄進行更改的機會。如果您的repo具有subdirs a/b,a/c和a/d,並且您更改了/ b/.svnignore,但您也在其他地方進行了更改,但對於此腳本的目標**,您不希望做「svn commit a」。 3)我同意你可以使用find + xargs,但是恕我直言,這個腳本的可讀性較差,因此維護性較差。 – mhucka 2013-03-04 03:36:39
@mhucka - 我會在第一行中選擇(在WC的ROOT中),svn狀態在第二位,退出狀態不會顯示「Clean WC」。在完成這個完整性檢查後*我可以*提交一次 - 使用您的代碼,我們將會有混亂的日誌並加載超過需要的服務器(想象100-200個子服務器)。總之 - 我寧願使用Clean Working copy,它的速度更快,服務器的壓力更小,代碼更緊湊。 – 2013-03-04 04:10:25
在開始時添加支票是個不錯的主意。它可以改變你描述的腳本,這反過來會有你提到的優點,所以這是一個改進 - 畢竟這就是我所要求的。我會按照你的建議重寫它。 – mhucka 2013-03-04 19:02:33