有没有更好的方法来处理svn:忽略项目的列表?

时间:2013-02-28 21:23:27

标签: svn

对于我们的项目,我们避免在用户的svn配置文件中使用svn global-ignores,因为这些svn设置仅限于客户端,而不是项目的属性。我们想要一种使用类似.gitignore文件管理项目子目录中被忽略文件的方法。我开发了一个简单的方案,使用.svnignore文件结合脚本(1)在目录树中查找.svnignore文件,以及(2)更新每个目录中的svn:ignore属性找到.svnignore个文件。当有人更新文件时,他们只需要记住运行脚本;我们发现这比手动管理目录上的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. 您在此处看到的方法或脚本是否有任何危险?
  3. 感谢您的任何提示。

3 个答案:

答案 0 :(得分:2)

  • 我无法理解svn up内部循环(WC 的根中的单个更新之前会更优雅的方式)
  • 使用--depth = immediates的Multiply提交也是非常糟糕的想法 - 为什么在所有属性更改都已应用后才使用单一提交
  • 查找结果(添加-print0)可以通过管道传输到svn propset的xargs,完全消除周期
  • 传递给脚本WC-root并执行(一次)更新并在WC的根目录中提交似乎(对我来说)不是一个坏主意

答案 1 :(得分:1)

现在对你没什么帮助,但是Subversion 1.8(当它发布时)会有Repository Dictated Configuration,它会对你有帮助。特别是1.8将有一个svn:global-ignores属性,其作用类似于global-ignores配置选项。 1.8还将具有可继承属性和svn:global-ignores是一种可继承的属性。因此,在目录上设置此属性将影响该目录下的任何内容。

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

答案 2 :(得分:0)

不要放弃对全球的忽视如此之快。您可以通过SVN外部的某种机制更新它们,例如登录脚本或(在Windows上)全局策略。

当然,只有拥有集中管理的环境,例如,在公司网络中。对于一个开源项目,这不会起作用。但是你可能无论如何也不会使用SVN。