2010-09-17 173 views
3

我总是遇到svn:ignore的问题,但是这次我想我可能会尝试一些不可能的事情。svn:忽略生成的子文件夹

假设目录结构:

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

我想忽略化身目录的所有子文件夹,但不是目录(keepme.jpg,keepmetoo.jpg)的文件。

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

这可能吗?如何?

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

+0

如果您想引发一些兴趣,请为您的问题添加赏金。 – Will 2011-02-02 12:02:11

+0

@ulidtko:tbh这个问题真的很老,我不记得为什么它必须是这样的具体。我会在早上更详细地更新这个问题。至于VCS系统的尴尬使用,你是正确的,但是从内存来看,由于正在使用的框架和最初的实现,我们有一些目录布局限制。对不起,我不能更具体。 – xzyfer 2011-02-09 12:45:48

+0

请参阅http://stackoverflow.com/questions/4889375/svn-ignore-subfolders – 2013-11-14 10:01:19

回答

2

你想存储整个很多的svn,除了/ avataurs/fu和avatars/ba(实际上所有的头像/ xxx)?

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

除了下一个问题是,你不希望任何人'不小心'添加新生成的子目录 - 在这种情况下,预先提交钩子是必不可少的。它们确实非常简单 - 你只需要编写一个快速批处理文件或者perl脚本来对传入文件的路径执行aregex,并且返回1(如果有的话)包含".*/avatars/.*/.*"(这仍然允许将新文件添加到该目录中) 。挂钩还可以返回将要显示给正在添加文件的用户的文本。我使用一个来阻止文件被禁止列表中的文件扩展名(例如.obj等)。

如果化身的subdirs永远不会成为SVN,那么你永远不会检查出来 - 显然 - 你的工作已经完成!


这是我的pre-commit.cmd钩子文件的副本。只要把它放到你的钩子目录(在窗口中),你就可以走了。

@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 

忽略-matches.txt文件中包含这样的线路:

^[^D].*\.obj$ 

任何条目相匹配的忽略,matches.txt文件意味着在提交被拒绝,用户将不得不再试一次,这次是正确的。

+0

预提交钩子是多么便携?我自己并不熟悉,所以对于这些问题需要遵循。钩子脚本是否进入repo配置本身,或者是每个负责在本地签出中设置钩子的用户。我问,因为我们在Ubuntu上使用windows和commandline svn中的tortisesvn混合。 – xzyfer 2011-02-10 01:19:45

+0

他们是服务器端,回购配置类型的东西。看看你的repo,你会看到一个hooks目录,其中已经有一些示例模板,只是等待被重命名为可执行脚本。 http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html#svn.reposadmin.create.hooks – gbjbaanb 2011-02-10 13:12:51

1

简而言之,仅配置纯SVN这是不可能的。但是你有设置这些属性的一些选项,并检查它们,就像

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

在服务器端,您可以

  • 拒绝承诺在提交前的,如果他们不遵守规则,
  • 自动更新在提交后挂机的设置,
  • 或者需要智能开发人员并只需在CI系统中进行检查。

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

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

当然,文件~svnignore应该是你可以保证为别的不使用的文件名。如果这是在生成时自动调用的,这应该适用于每个人。

其次,我会推荐检查pre-commit钩子中的完整性。在后期提交中做它可能是可以接受的,在持续集成系统中这样做肯定会为时过晚。

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

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

+0

我们在ubuntu shell中直接使用了tortisesvn和命令行,因此您注意到最后一个选项不可用。编辑svn:当运行自动生成时忽略不可行,要么因为这些目录被删除并且每天创建多次。不幸的是,无论开发人员多么聪明,每个人最终都会犯错误:)我确实认为pre-commit钩子可能是要走的路。 – xzyfer 2011-02-10 01:12:55

+0

可移植性如何预先提交钩子?我自己并不熟悉,所以对于这些问题需要遵循。钩子脚本是否进入repo配置本身,或者是每个负责在本地签出中设置钩子的用户。我问,因为我们在Ubuntu上使用windows和commandline svn中的tortisesvn混合。 – xzyfer 2011-02-10 01:20:02

+1

首先,我想补充一点,每天多次运行“set-svn-ignore”脚本是没有问题的 - 几乎立刻就完成了。其次,钩子脚本是服务器端的,是repo配置的一部分,并且是系统特定的(cmd vs.bash),但通过使用unix shell(并且在windows上使用mingw/msys/etc。)+ svnlook,系统特定部分变得无关紧要。我会把它留给@gbjbaanb,因为他对我来说就是关注那个部分,并且已经有了一个例子。 – gimpf 2011-02-10 11:48:38