在Subversion存储库中存储文件权限
如何将文件权限存储在存储库中? 有几个文件需要是只读的,以阻止第三方程序摧毁它,但在检出版本库后,它们被设置为读写。
我查看了谷歌,并从2005年发现了一篇博客文章 ,指出Subversion不存储文件权限。 有补丁和挂钩脚本列出(只有一个url仍然存在)。 三年之后,Subversion仍然没有存储文件许可权,并且只有这样才能实现这个目标? (我从来没有做过钩子,而是使用Subversion原生的东西。)
一个可能的解决scheme是编写一个脚本,并将其与代码的其余部分一起检查,并将其作为构build过程的第一步运行。
此脚本贯穿代码库的副本并设置某些文件的读取权限。
理想情况下,脚本会从简单的input文件读取文件列表。 这可以使其他开发人员易于维护和轻松了解哪些文件被标记为只读。
SVN确实具有存储元数据( 属性 )和文件的能力。 这些属性基本上只是键/值对,但是有一些特殊的键,如'svn:executable',如果这个属性存在于文件中,Subversion会在检出文件时为该文件设置文件系统的可执行位。 虽然我知道这不是你正在寻找的东西,但它可能就够了(对我来说)。
还有其他一些线路结尾(svn:eol-style)和mimetypes(svn:mime-type)的属性。
在SVN中没有原生的方式来存储文件的权限。
asvn和来自该博客文章的补丁似乎都已经启动了(并且在官方的SVN仓库中),这是一件好事,但我不认为他们将在短时间内在核心版本中进行这样的元数据处理。
SVN有能力处理符号链接和可执行文件很长一段时间,但在Win32上都不能正常工作。 我不会屏住呼吸另一个这样的非便携式function(尽pipe在现有的元数据系统之上实现并不难)。
我会考虑编写一个shell脚本来手动调整文件权限,然后将其放入存储库。
因为这在以前的回应中还没有完全说明。 我讨厌复活僵尸线程。
由于为SVN添加权限支持必须容纳多个操作系统和权限types,NFS,POSIX,ARWED和RACF
这会使SVN臃肿,可能与冲突的权限types(如NFS和POSIX)冲突,或者打开可能的漏洞/安全漏洞。
有几个解决方法。 pre-commit,post-commit,start-commit是比较常用的,也是Subversion系统的一部分。 但是可以让你用你喜欢的任何编程语言来控制权限。
我实现的系统就是我所说的打包程序,它validation工作副本的提交文件,然后parsing元数据文件,该文件列出了文件/文件夹所需的默认权限以及您所需的任何更改。
Owner, Group, Folders, Files default: <user> www-user 750 640 /path/to/file: <user> non-www 770 770 /path/to/file2: <user> <user> 700 700
你也可以扩展它,并允许自动移动,重命名,按types标记修订版本,比如alpha,beta,release候选版本,release
至于支持客户端检查你的资料库文件附加的权限。 您最好考虑创build一个包的安装程序,并将其作为资源提供。
想象一下,人们用一个可执行文件来设置他们的存储库,它的权限是root:www-user 4777
这是SVN补丁的更新链接,它正确处理unix样式的文件权限。 我已经testing了fedora12,似乎按预期工作:
我只是保存它/ usr / bin / asvn,并使用asvn而不是svn命令,如果我需要权限处理正确。
许多答案都表示,svn不存储文件权限。 这可能是事实,但我能够解决一个没有执行权限问题的DLL文件,只需通过以下步骤:
- chmod 755 badpermission.dll
- mv badpermission.dll ../
- svn更新
- svn rm badpermission.dll
- svn commit badpermission.dll -m“删除dll修复权限”
- mv ../badpermission.dll。
- svn add badpermission.dll
- svn commit badpermission.dll -m“将dll添加回修复权限”
- rm badpermission.dll
- svn更新
- badpermission.dll带回执行权限
@morechilli:
从我以前的post和在OP的博客中的asvn包装似乎做你的build议。 虽然它将权限存储在相应文件的存储库属性中,而不是单个外部文件。
我build议使用mtree工具生成权限映射(FreeBSD默认使用它),将映射存储在存储库中,并且如上所述,运行一个脚本,从映射中恢复适当的文件权限作为第一步build立过程。
locking不能解决这个问题。 locking会阻止其他人编辑文件。 这是第三方应用程序,它作为构build过程的一部分运行,试图写入文件 – 改变它 – 这打破了构build过程。 因此,我们需要停止程序改变文件,只是简单地标记文件只读。 我们希望将这些信息保存在存储库中,并通过签入,分支机构等进行传输。
格雷厄姆, svn
不存储权限。 你唯一的select是把你的电话打包到脚本中。 该脚本应该用它的参数调用svn
,然后设置权限。 根据你的环境,你可能需要调用你的脚本svn
并调整PATH
以确保它被调用。
我非常喜欢morechilli的想法,将文件和权限列表存入存储库本身。
我们为我们创build了一个batch file。 宁愿实际支持在颠覆虽然…
考虑使用svn lock
禁止其他人写入文件。