svn:忽略生成的子文件夹

时间:2010-09-17 05:01:00

标签: svn tortoisesvn svnignore

我总是遇到svn麻烦:忽略,但这次我想我可能会尝试一些不可能的东西。

假设dir结构:

/
   /foo
   /bar
   /web
      /uploads
          /assets
          /avatars
              /fu
                  /*.jpg
              /ba
                  /*.jpg
              keepme.jpg
              keepmetoo.jpg

我希望忽略avatars目录的所有子文件夹,但不要忽略该目录的文件(keepme.jpg,keepmetoo.jpg)。

头像子文件夹(fu,ba)是自动生成的,名称无法预先确定,因此需要完全忽略所有/头像子文件夹。

这可能吗?怎么样?

编辑我们不希望使用提交后挂钩。这只是一个偏好问题。我们有很多完善的应用程序,并且已经开发出一种标准化的处理方式,并且提交挂钩尚未被利用。我们很乐意不添加任何不必要的额外移动部件。坦率地说,在考虑添加提交后挂钩之前,我们更有可能解决目录结构(这不是一项小任务)。

3 个答案:

答案 0 :(得分:2)

你想将整个地段存储在svn中,除了/ avataurs / fu和avatars / ba(事实上所有的avatars / xxx)?

您最初需要将剩余的目录结构添加到svn。使用Tortoise添加根目录,取消检查您不想添加的目录,然后提交。这解决了最初的问题 - 不提交有问题的子目录,一切都很好。

除此之外,下一个问题是你不希望其他人“意外地”添加新生成的子目录 - 在这种情况下,预提交钩子是必不可少的。它们确实非常简单 - 您只需要编写一个快速批处理文件或perl脚本,在传入文件的路径上执行isgex,如果有任何包含".*/avatars/.*/.*",则返回1(这仍然允许添加新文件)到那个目录)。钩子还可以返回将显示给正在添加文件的用户的文本。我使用一个来阻止在禁止列表上使用文件扩展名签入文件(例如.obj等)。

如果头像细分从未进入SVN,那么你永远不会检查它们 - 显然 - 你的工作已经完成了!


这是我的pre-commit.cmd挂钩文件的副本。只需将其放入钩子目录(在Windows上),你就可以了。

@echo off

svnlook changed -t %2 %1 > c:\temp\pre-commit.txt

findstr /G:"%1\hooks\ignore-matches.txt"  c:\temp\pre-commit.txt > c:\temp\precommit-bad.txt
if %ERRORLEVEL% NEQ 0 exit 0

echo disallowed file extension >> c:\temp\precommit-bad.txt

type c:\temp\precommit-bad.txt 1>&2
exit 1

ignore-matches.txt文件包含如下行:

^[^D].*\.obj$

与ignore-matches.txt文件中的条目匹配的任何内容都意味着拒绝提交,用户必须再次尝试,这次正确。

答案 1 :(得分:1)

简而言之,对于仅配置纯SVN,这是不可能的。但是您可以选择设置这些属性,以及检查它们,例如

  • 加强你的头像自动生成工具,
  • 在自动生成后调用批处理文件更新SVN设置
  • 在提交之前调用批处理文件更新SVN设置。

在服务器端,您可以

  • 如果他们不遵守规则,则拒绝提交预先提交,
  • 自动更新提交后挂钩的设置,
  • 或要求智能开发人员,只需检查CI系统。

首先,我建议在自动生成文件夹后自动更新svn:ignore属性。最简单的方法是在生成后调用批处理文件。批处理文件本身很简单:

@echo off
echo.>~svnignore
dir /b /aD >~svnignore
svn propset svn:ignore --file ~svnignore .
del ~svnignore

当然,文件~svnignore应该是一个文件名,您可以保证不会将其用于任何其他内容。如果在生成时自动调用它,这应适用于所有人。

其次,我建议在预提交钩子中检查完整性。在后提交中执行它可能是可以接受的,在持续集成系统中执行它肯定会为时已晚。

最后,你有另一个选择,虽然我不建议采用这条路线:当你用tortoisesvn标记问题时,我假设你使用这个工具。这为您提供了使用客户端预提交挂钩的附加选项。为此,请进入TortoiseSVN设置对话框。在左侧树中,您将找到一个条目 Hook Scripts ,您可以在其中配置某些可执行文件(如批处理文件...),以便在特定时间执行,例如 pre-提交时间。

这样做的缺点是你几乎打破了SVN的所有控制台使用,如果你想为某些版本/标签等进行一些自动化,这将毫无价值。

答案 2 :(得分:-2)

设置start-commit hook可能是一种解决方案。