您如何将文件权限存储在存储库中?一些文件需要只读以阻止第三方程序破坏它,但在签出存储库后,它们被设置为读写。
我在 google 上找到了一篇 2005 年的博客文章,其中指出 Subversion 不存储文件权限。列出了补丁和钩子脚本(只有一个 url 仍然存在)。三年后,Subversion 是否仍然不存储文件权限,并且挂钩是解决此问题的唯一方法吗?(我从来没有做过钩子,而是使用了 Subversion 原生的东西。)
您如何将文件权限存储在存储库中?一些文件需要只读以阻止第三方程序破坏它,但在签出存储库后,它们被设置为读写。
我在 google 上找到了一篇 2005 年的博客文章,其中指出 Subversion 不存储文件权限。列出了补丁和钩子脚本(只有一个 url 仍然存在)。三年后,Subversion 是否仍然不存储文件权限,并且挂钩是解决此问题的唯一方法吗?(我从来没有做过钩子,而是使用了 Subversion 原生的东西。)
SVN 确实具有将元数据(属性)与文件一起存储的能力。属性基本上只是键/值对,但是有一些特殊的键,例如 'svn:executable',如果文件存在此属性,Subversion 将在检出文件时为该文件设置文件系统的可执行位。虽然我知道这并不完全是您正在寻找的东西,但它可能就足够了(对我来说)。
行尾 (svn:eol-style) 和 mime 类型 (svn:mime-type) 还有其他属性。
在 SVN 中没有本地存储文件权限的方法。
asvn和该博客文章中的补丁似乎都已启动(并托管在官方 SVN 存储库中),这是一件好事,但我认为他们不会很快在核心版本中进行此类元数据处理。
SVN 有能力专门处理符号链接和可执行文件很长一段时间,但在 Win32 上都不能正常工作。我不会为另一个这样的非便携式功能屏住呼吸(尽管在已经存在的元数据系统之上实现它不会太难。)
我会考虑编写一个 shell 脚本来手动调整文件权限,然后将其放入存储库中。
一种可能的解决方案是编写一个脚本,将其与其余代码一起签入,并作为构建过程的第一步运行。
此脚本运行您的代码库副本并设置某些文件的读取权限。
理想情况下,脚本会从一个简单的输入文件中读取文件列表。这将使其他开发人员易于维护并且易于理解哪些文件被标记为只读。
因为这在之前的回复中还没有完全说明。我讨厌复活僵尸线程。
由于为 SVN 添加权限支持必须适应多种操作系统和权限类型、NFS、POSIX、ARWED 和 RACF
这会使 SVN 臃肿,可能与 NFS 和 POSIX 等冲突的权限类型发生冲突,或者打开可能的漏洞利用/安全漏洞。
有几种解决方法。pre-commit、post-commit、start-commit 是比较常用的,并且是 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 权限的可执行文件
这是正确处理 unix 样式文件权限的 SVN 补丁的更新链接。我已经在 fedora12 上进行了测试,并且似乎可以按预期工作:
如果我需要正确处理权限,我只是将其保存在 /usr/bin/asvn 并使用 asvn 而不是 svn 命令。
许多答案都表明 svn 不存储文件权限。这可能是真的,但我可以通过以下步骤解决没有执行权限问题的 dll 文件:
@morechilli:
我之前的帖子中的 asvn 包装器和 OP 帖子中的博客似乎符合您的建议。尽管它将权限存储在相应文件的存储库属性中,而不是单个外部文件。
我建议使用 mtree 实用程序生成权限映射(FreeBSD 默认有它),将映射存储在存储库中,并且如上所述,运行一个脚本,作为第一步从映射恢复正确的文件权限构建过程。
锁定不能解决这个问题。锁定会阻止其他人编辑文件。这是一个第三方应用程序,它作为构建过程的一部分运行,它试图写入文件 - 更改它 - 这会破坏构建过程。因此,我们需要阻止程序更改文件,这只是将文件标记为只读。我们希望将这些信息保存在存储库中,并通过签入、分支等进行传递。
格雷厄姆,svn
不存储权限。您唯一的选择是将调用包装svn
在脚本中。该脚本应svn
使用其参数调用,然后设置权限。根据您的环境,您可能需要调用您的脚本svn
并调整您的脚本PATH
以确保它被调用。
我非常喜欢 morechilli 将文件和权限列表签入存储库本身的想法。
我们创建了一个批处理文件来为我们执行此操作。虽然更喜欢颠覆的实际支持......
考虑使用svn lock
禁止其他人写入文件。