41

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

我在 google 上找到了一篇 2005 年的博客文章,其中指出 Subversion 不存储文件权限。列出了补丁和钩子脚本(只有一个 url 仍然存在)。三年后,Subversion 是否仍然不存储文件权限,并且挂钩是解决此问题的唯一方法吗?(我从来没有做过钩子,而是使用了 Subversion 原生的东西。)

4

12 回答 12

36

SVN 确实具有将元数据(属性)与文件一起存储的能力。属性基本上只是键/值对,但是有一些特殊的键,例如 'svn:executable',如果文件存在此属性,Subversion 将在检出文件时为该文件设置文件系统的可执行位。虽然我知道这并不完全是您正在寻找的东西,但它可能就足够了(对我来说)。

行尾 (svn:eol-style) 和 mime 类型 (svn:mime-type) 还有其他属性。

于 2008-09-11T11:25:17.140 回答
14

在 SVN 中没有本地存储文件权限的方法。

asvn和该博客文章中的补丁似乎都已启动(并托管在官方 SVN 存储库中),这是一件好事,但我认为他们不会很快在核心版本中进行此类元数据处理。

SVN 有能力专门处理符号链接可执行文件很长一段时间,但在 Win32 上都不能正常工作。我不会为另一个这样的非便携式功能屏住呼吸(尽管在已经存在的元数据系统之上实现它不会太难。)

我会考虑编写一个 shell 脚本来手动调整文件权限,然后将其放入存储库中。

于 2008-09-11T11:23:52.493 回答
11

一种可能的解决方案是编写一个脚本,将其与其余代码一起签入,并作为构建过程的第一步运行。

此脚本运行您的代码库副本并设置某些文件的读取权限。

理想情况下,脚本会从一个简单的输入文件中读取文件列表。这将使其他开发人员易于维护并且易于理解哪些文件被标记为只读。

于 2008-09-11T10:23:29.503 回答
4

因为这在之前的回复中还没有完全说明。我讨厌复活僵尸线程。

由于为 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 权限的可执行文件

于 2012-02-24T03:13:08.180 回答
3

是正确处理 unix 样式文件权限的 SVN 补丁的更新链接。我已经在 fedora12 上进行了测试,并且似乎可以按预期工作:

如果我需要正确处理权限,我只是将其保存在 /usr/bin/asvn 并使用 asvn 而不是 svn 命令。

于 2010-06-11T02:13:57.053 回答
3

许多答案都表明 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 以执行权限返回
于 2011-11-21T15:25:23.290 回答
1

@morechilli:

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

于 2008-09-11T11:28:54.087 回答
1

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

于 2010-07-17T18:54:20.890 回答
0

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

于 2008-09-11T10:08:44.123 回答
0

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

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

于 2008-09-11T10:28:44.810 回答
0

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

于 2008-09-11T11:12:34.267 回答
-6

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

于 2008-09-11T09:49:11.597 回答