【问题标题】:svn:ignore generated subfolderssvn:忽略生成的子文件夹
【发布时间】:2010-09-17 05:00:59
【问题描述】:

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

假设目录结构:

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

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

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

这可能吗?以及如何?

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

【问题讨论】:

  • 如果您想激发对它的兴趣,请为您的问题添加一个赏金。
  • @ulidtko:这个问题真的很老了,我不记得为什么它必须这样的具体原因。我会在早上用更多细节更新这个问题。至于 VCS 系统的笨拙使用,你是对的,但是从记忆中我们有一些目录布局限制,因为使用的框架和初始实现。抱歉,我不能更具体。

标签: svn tortoisesvn svnignore


【解决方案1】:

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

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

除了,下一个问题是您不希望任何其他人“意外”添加新生成的子目录 - 在这种情况下,预提交挂钩是必不可少的。它们确实非常简单 - 您只需要编写一个快速批处理文件或 perl 脚本,在传入文件的路径上执行 aregex,如果包含 ".*/avatars/.*/.*" 则返回 1(这仍然允许将新文件添加到该文件中)目录)。该钩子还可以返回将显示给正在添加文件的用户的文本。我使用一个来防止文件被签入,文件扩展名为禁止列表(例如 .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 文件中的条目匹配的内容都意味着提交被拒绝,用户必须再次尝试,这次正确。

【讨论】:

  • 预提交挂钩的可移植性如何?我自己对它们并不熟悉,因此为接下来的 n00bish 问题道歉。钩子脚本是否进入 repo 配置本身,或者每个用户负责在其本地结帐中设置钩子。我问是因为我们在 Windows 上使用了 tortisesvn,在 ubuntu 中使用了命令行 svn。
  • 它们是服务器端的 repo-configuration 类型的东西。查看您的存储库,您会看到一个 hooks 目录,其中已经有一些示例模板等待重命名为可执行脚本。 svnbook.red-bean.com/nightly/en/…
【解决方案2】:

简而言之,使用纯配置的纯 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,您可以在其中配置一些可执行文件(如批处理文件...)以在特定时间执行,例如在 pre-提交时间。

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

【讨论】:

  • 我们在 ubuntu shell 中直接使用 tortisesvn 和命令行,因此您注意到最后一个选项不可用。在运行自动生成时编辑 svn:ignore 也不可行,因为这些目录每天都会被删除并创建多次。可悲的是,无论开发人员多么聪明,每个人最终都会犯错 :) 我确实相信 pre-commit hooks 可能是要走的路
  • 预提交挂钩的可移植性如何?我自己对它们并不熟悉,因此为接下来的 n00bish 问题道歉。钩子脚本是否进入 repo 配置本身,或者每个用户负责在其本地结帐中设置钩子。我问是因为我们在 Windows 上使用了 tortisesvn,在 ubuntu 中使用了命令行 svn。
  • 首先,我想补充一点,每天多次运行“set-svn-ignore”脚本是没有问题的——它几乎很快就完成了。其次,钩子脚本是服务器端的,是 repo 配置的一部分,并且是系统特定的(cmd 与 bash),但是通过使用 unix shell(在 windows 上使用 mingw/msys/etc.)+ svnlook,系统具体部分变得无关紧要。我会把它留给@gbjbaanb,因为与我相比,他专注于那部分并且已经有一个例子。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多