2013-02-28 43 views
0

對於我們的項目,我們避免在用戶的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. 有沒有更好的方式來完成相同的事情?
  2. 您在這裏看到的方法或腳本中是否存在危險?

感謝您的任何提示。

回答

2
  • 我無法理解svn up內循環(一次更新根的WC 之前會更優雅的方式)
  • 乘用--depth =的立即提交也非常糟糕想法 - 爲什麼不使用單一提交後,所有的屬性更改已經應用
  • 查找結果(與添加-print0)可以傳送到xargs爲svn propset,完全消除週期
  • 傳遞到腳本WC-root和執行(一次)更新和WC的根似乎並不(對我來說)提交作爲一個壞主意
+0

謝謝!解釋: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

+0

@mhucka - 我會在第一行中選擇(在WC的ROOT中),svn狀態在第二位,退出狀態不會顯示「Clean WC」。在完成這個完整性檢查後*我可以*提交一次 - 使用您的代碼,我們將會有混亂的日誌並加載超過需要的服務器(想象100-200個子服務器)。總之 - 我寧願使用Clean Working copy,它的速度更快,服務器的壓力更小,代碼更緊湊。 – 2013-03-04 04:10:25

+0

在開始時添加支票是個不錯的主意。它可以改變你描述的腳本,這反過來會有你提到的優點,所以這是一個改進 - 畢竟這就是我所要求的。我會按照你的建議重寫它。 – mhucka 2013-03-04 19:02:33

0

不要忽視全球這麼快放棄。您可以通過SVN外部的某種機制來更新它們,例如登錄腳本或(在Windows上)全局策略。

當然,這隻適用於擁有集中管理環境的情況,例如,在公司網絡中。對於一個開源項目,這是行不通的。但是,那麼你可能不會使用SVN。

+0

其實,我們所有的項目都是開源的(使用SourceForge)。當然,幾乎所有的工作都是由我們的(學術,付費)團隊完成的,但是原則上它和任何項目一樣開放。 – mhucka 2013-03-01 03:53:45

1

現在沒有什麼幫助,但Subversion 1.8(當它發佈時)會有Repository Dictated Configuration,它可以幫助你。特別是1.8會有一個像全局忽略配置選項一樣工作的svn:global-ignores屬性。另外1.8將會有可繼承的屬性,svn:global-ignores就是這樣一個可繼承的屬性。因此,在目錄中設置此屬性將影響該目錄下的任何內容。

http://subversion.apache.org/docs/release-notes/1.8.html#repos-dictated-config

+0

這聽起來像它會解決這個問題。我很期待。感謝您的領導! – mhucka 2013-03-04 03:37:21

相關問題