0

对于我们的项目,我们避免global-ignores在用户的 svn 配置文件中使用 svn,因为这些 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. 您在此处看到的方法或脚本是否存在任何危险?

感谢您的任何提示。

4

3 回答 3

2
  • 我无法理解svn up循环内部(之前在 WC的根目录中进行一次更新会更优雅)
  • 将提交与 --depth=immediates 相乘也是一个非常糟糕的主意 - 为什么在对属性的所有更改都已应用后不使用单个提交
  • find (添加-print0)的结果可以通过管道传输到 xargs for svn propset,完全消除循环
  • 传递给脚本 WC-root 并在 WC 的根目录中执行(一次)更新和提交似乎(对我来说)不是一个坏主意
于 2013-02-28T22:20:15.237 回答
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

于 2013-03-02T02:52:09.763 回答
0

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

当然,这仅适用于您有一个集中管理的环境,例如在公司网络中。对于开源项目,这是行不通的。但是你可能无论如何都不会使用 SVN。

于 2013-02-28T22:54:53.007 回答