在 Subversion 存储库中存储文件权限
-
09-06-2019 - |
题
如何在存储库中存储文件权限?一些文件需要是只读的,以阻止第三方程序破坏它,但在检出存储库后,它们被设置为读写。
我在谷歌上查了一下,发现了一个 2005 年的博客文章 表明 Subversion 不存储文件权限。列出了补丁和挂钩脚本(仅存在一个 url)。三年后,Subversion 仍然不存储文件权限吗?钩子是解决此问题的唯一方法吗?(我从来没有做过钩子,而是使用 Subversion 原生的东西。)
解决方案
一种可能的解决方案是编写一个脚本,将其与其余代码一起签入,并作为构建过程的第一步运行。
该脚本运行您的代码库副本并设置某些文件的读取权限。
理想情况下,脚本将从简单的输入文件中读取文件列表。这将使维护变得容易,并且其他开发人员也可以轻松了解哪些文件被标记为只读。
其他提示
SVN确实具有存储元数据的能力(特性)以及一个文件。这些属性基本上只是键/值对,但是有一些特殊的键,例如“svn:executable”,如果文件存在此属性,Subversion 将在检出文件时设置该文件的文件系统的可执行位。虽然我知道这并不完全是您正在寻找的东西,但这可能就足够了(对我来说)。
还有其他用于行结束符 (svn:eol-style) 和 mime 类型 (svn:mime-type) 的属性。
因为之前的回复中还没有完全说明这一点。但我讨厌复活僵尸线程。
由于添加对 SVN 的权限支持必须适应多个操作系统和权限类型、NFS、POSIX、ARWED 和 RACF
这会使 SVN 变得臃肿,可能与 NFS 和 POSIX 等冲突的权限类型发生冲突,或者打开可能的漏洞利用/安全漏洞。
有几个解决方法。预提交、后提交、开始提交是更常用的,并且是 Subversion 系统的一部分。但将允许您使用您喜欢的任何编程语言来控制权限。
我实现的系统就是我所说的打包程序,它验证工作副本的提交文件,然后解析元数据文件,其中列出了文件/文件夹所需的默认权限,以及您希望对它们进行的任何更改。
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
您还可以对此进行扩展,并允许进行诸如自动移动、重命名、按类型标记修订(例如 alpha、beta、发布候选版本、发布版本)等操作
至于支持客户端签出您的存储库文件并附加权限。您最好考虑创建软件包的安装程序并将其作为资源提供。
想象一下人们在其存储库中设置了一个可执行文件,并设置了 root 权限:www-user 4777
这 是 SVN 补丁的更新链接,它可以正确处理 unix 样式文件权限。我已经在 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 添加 badpermission.dll
- svn commit badpermission.dll -m“将 dll 添加回来以修复权限”
- rm badpermission.dll
- svn更新
- badpermission.dll 带着执行权限返回
@morechilli:
我之前的帖子中的 asvn 包装器和 OP 帖子中的博客似乎符合您的建议。尽管它将权限存储在相应文件的存储库属性中,而不是单个外部文件中。
我建议使用 mtree 实用程序生成权限映射(FreeBSD 默认情况下有它),将映射存储在存储库中,并且如上所述,运行一个脚本,该脚本将从映射中恢复正确的文件权限,作为创建权限映射的第一步。构建过程。
锁定并不能解决这个问题。锁定可阻止其他人编辑文件。这是一个第三方应用程序,它作为构建过程的一部分运行,尝试写入文件 - 更改它 - 这会破坏构建过程。因此,我们需要阻止程序更改文件,这只是将文件标记为只读。我们希望这些信息保存在存储库中并在签入、分支等之间传递。
格雷厄姆, svn
不存储权限。您唯一的选择是将您的呼叫转至 svn
在脚本中。该脚本应该调用 svn
及其参数,然后设置权限。根据您的环境,您可能需要调用脚本 svn
并调整你的 PATH
以确保它被调用。
我非常喜欢 morechilli 的想法,即将文件列表和权限签入存储库本身。
我们创建了一个批处理文件来为我们执行此操作。不过更喜欢颠覆中的实际支持......
考虑使用 svn lock
禁止其他人写入该文件。