在Subversion存储库中存储文件权限

时间:2008-09-11 09:45:38

标签: windows svn file-permissions

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

我查看了谷歌,发现blog post from 2005表明Subversion不存储文件权限。列出了补丁和钩子脚本(只有一个URL仍然存在)。三年之后,Subversion仍然没有存储文件权限,并且挂钩是解决这个问题的唯一方法吗? (我从未做过钩子,而是使用Subversion原生的东西。)

12 个答案:

答案 0 :(得分:36)

SVN确实能够存储元数据(properties)和文件。属性基本上只是键/值对,但是有一些特殊的键,如'svn:executable',如果文件存在此属性,Subversion将在检出文件时为该文件设置文件系统的可执行位。虽然我知道这不是你想要的,但它可能就足够了(对我而言)。

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

答案 1 :(得分:14)

在SVN中没有以本机方式存储文件权限。

该博客文章中的asvnthe patch似乎都已启动(并托管在官方SVN存储库中),这是一件好事,但我认为他们不会拥有此类元数据随时处理核心版本。

SVN已经能够长时间处理symbolic linksexecutables,但在Win32上都无法正常工作。我不会屏住另一个这样的非便携式功能(尽管在现有的元数据系统之上实现它并不会太难。)

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

答案 2 :(得分:10)

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

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

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

答案 3 :(得分: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

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

许多答案都声明svn不存储文件权限。这可能是真的,但我能够通过以下步骤解决没有执行权限问题的dll文件:

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

答案 6 :(得分:1)

@morechilli:

我早前帖子中的asvn包装器和OP帖子中的博客似乎正在做你的建议。虽然它将权限存储在相应文件的存储库属性中,而不是单个外部文件。

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

我们为我们创建了一个批处理文件。宁愿在颠覆中更喜欢实际支持......

答案 11 :(得分:-6)

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