3

我总是在使用 svn:ignore 时遇到问题,但这次我想我可能正在尝试一些不可能的事情。

假设目录结构:

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

我想忽略头像目录的所有子文件夹,但不忽略该目录的文件(keepme.jpg、keepmetoo.jpg)。

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

这可能吗?如何?

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

4

3 回答 3

2

除了 /avataurs/fu 和 avatars/ba(实际上所有的 avatars/xxx)之外,您想将整个批次存储在 svn 中吗?

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

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

如果头像子目录永远不会进入 SVN,那么您将永远不会检查它们 - 显然 - 并且您的工作已经完成!


这是我的 pre-commit.cmd 挂钩文件的副本。只需将其放入您的 hooks 目录(在 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 文件中的条目匹配的内容都意味着提交被拒绝,用户将不得不再次尝试,这次是正确的。

于 2011-02-09T13:35:43.923 回答
1

简而言之,使用纯配置的纯 SVN 这是不可能的。但是您有一些选项可以设置这些属性并检查它们,例如

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

在服务器端,您可以

  • 如果不遵守规则,则在预提交时拒绝提交,
  • 自动更新提交后挂钩上的设置,
  • 或者需要聪明的开发者并且只签入 CI 系统。

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

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

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

其次,我建议在预提交挂钩中检查完整性。在 post-commit 中做可能是可以接受的,在持续集成系统中做肯定为时已晚。

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

这样做的缺点是您实际上破坏了 SVN 的所有控制台使用,如果您想对某些构建/标签等进行一些自动化,这将毫无价值。

于 2011-02-09T13:16:37.597 回答
-2

设置一个start-commit 钩子可能是一个解决方案。

于 2010-09-17T06:17:48.143 回答