如何在存储库中存储文件权限?一些文件需要是只读的,以阻止第三方程序破坏它,但在检出存储库后,它们被设置为读写。

我在谷歌上查了一下,发现了一个 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 等冲突的权限类型发生冲突,或者打开可能的漏洞利用/安全漏洞。

有几个解决方法。预提交、后提交、开始提交是更常用的,并且是 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 文件:

  1. chmod 755 badpermission.dll
  2. mv badpermission.dll ../
  3. svn更新
  4. svn rm badpermission.dll
  5. svn commit badpermission.dll -m“删除 dll 以修复权限”
  6. mv ../badpermission.dll 。
  7. svn 添加 badpermission.dll
  8. svn commit badpermission.dll -m“将 dll 添加回来以修复权限”
  9. rm badpermission.dll
  10. svn更新
  11. badpermission.dll 带着执行权限返回

@morechilli:

我之前的帖子中的 asvn 包装器和 OP 帖子中的博客似乎符合您的建议。尽管它将权限存储在相应文件的存储库属性中,而不是单个外部文件中。

我建议使用 mtree 实用程序生成权限映射(FreeBSD 默认情况下有它),将映射存储在存储库中,并且如上所述,运行一个脚本,该脚本将从映射中恢复正确的文件权限,作为创建权限映射的第一步。构建过程。

锁定并不能解决这个问题。锁定可阻止其他人编辑文件。这是一个第三方应用程序,它作为构建过程的一部分运行,尝试写入文件 - 更改它 - 这会破坏构建过程。因此,我们需要阻止程序更改文件,这只是将文件标记为只读。我们希望这些信息保存在存储库中并在签入、分支等之间传递。

格雷厄姆, svn 不存储权限。您唯一的选择是将您的呼叫转至 svn 在脚本中。该脚本应该调用 svn 及其参数,然后设置权限。根据您的环境,您可能需要调用脚本 svn 并调整你的 PATH 以确保它被调用。

我非常喜欢 morechilli 的想法,即将文件列表和权限签入存储库本身。

我们创建了一个批处理文件来为我们执行此操作。不过更喜欢颠覆中的实际支持......

考虑使用 svn lock 禁止其他人写入该文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top