我总是遇到svn麻烦:忽略,但这次我想我可能会尝试一些不可能的东西。
假设dir结构:
/
/foo
/bar
/web
/uploads
/assets
/avatars
/fu
/*.jpg
/ba
/*.jpg
keepme.jpg
keepmetoo.jpg
我希望忽略avatars目录的所有子文件夹,但不要忽略该目录的文件(keepme.jpg,keepmetoo.jpg)。
头像子文件夹(fu,ba)是自动生成的,名称无法预先确定,因此需要完全忽略所有/头像子文件夹。
这可能吗?怎么样?
编辑我们不希望使用提交后挂钩。这只是一个偏好问题。我们有很多完善的应用程序,并且已经开发出一种标准化的处理方式,并且提交挂钩尚未被利用。我们很乐意不添加任何不必要的额外移动部件。坦率地说,在考虑添加提交后挂钩之前,我们更有可能解决目录结构(这不是一项小任务)。
答案 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: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可能是一种解决方案。