1

在我们的存储库中,来自不同操作系统的用户可以访问。其中一些,通常是 Windows 用户,将各种文件签入为可执行文件,这对 Unix 用户来说是一个痛苦。

我认为这是 Subversion 中的一个设计缺陷,svn:executable文件的存在或不存在决定了可执行位,而不是区分“忘记设置它”和“它真的不可执行”。

无论如何,有没有办法在技术上解决这个问题,而不是在社会上?可能是一个提交钩子,或者是广泛使用的 Windows 颠覆客户端(理想情况下是 Eclipse)的配置条目?

4

3 回答 3

2

使用预提交挂钩检查文件名,然后根据文件扩展名修改可执行标志:

http://svnbook.red-bean.com/en/1.6/svn-book.html#svn.reposadmin.create.hooks

于 2013-06-28T08:01:12.643 回答
0

我认为这是 Subversion 中的一个设计缺陷,即文件上 svn:executable 的存在与否决定了可执行位,而不是区分“忘记设置它”和“它真的不可执行”。

在 Windows 中,文件后缀决定了可执行性与否。放入svn:executable文件在 Windows 中没有任何区别,我不明白为什么您的 Windows 用户对批处理文件这样做。它只会扰乱 Unix 人的思想。

问题是 Unix 使用文件权限来确定文件的可执行性。可执行文件可以被称为任何东西,并且没有简单的方法来确定它,除非可执行文件设置了此执行权限位。

Subversionsvn:executable仅使用该属性来确定在检出文件时是否设置该位。在 Windows 上,是否foo.bat设置此位并不重要。它是可执行的。在 Unix 上,设置svn:executable只是使权限foo成为rwxr-xr-x而不是rw-r--r--.

更奇怪的是,您听起来像是 Subversion 正在强迫 Unix 用户执行不可执行的文件。就我而言,存储库中的所有文件都可以包含svn:executable它们。除非我知道该程序在做什么,否则即使它们可以运行,我也不会随便执行程序。

不,Windows 和 Unix 之间的真正问题是文件后缀。这才是真正的痛苦所在。如果我在 Windows 上创建一个 shell 脚本,即使我svn:executable在该文件上进行了设置,它也不会在 Unix 上执行,因为 Windows 放置了这些CRLF行尾,而 Unix 会阻塞这些行尾。

我有一个预提交挂钩,可用于确保在文件上设置属性。我使用它来强制用户将svn:eol-style=LF放在 shell 脚本和 Makefile 上,或者将svn:eol-style=设置CRLF在 Windows 批处理脚本上。您甚至可以使用它来强制用户设置svn:executable文件。例如,我们确保bin目录中或以结尾的所有文件*.sh都设置了此位。对我们来说,这个位没有在应该设置的时候被设置是问题所在。不,该位已设置,并且不应该设置。

但是,这个钩子中没有任何内容说Don't set this property。但是,如果这对您很重要,您可以自由地使用这个预提交挂钩并对其进行修改。

于 2013-06-28T12:22:46.587 回答
0

使用预提交挂钩。在预提交钩子中,使用 SVNLook,获取文件名,剪切扩展部分,并根据您要限制的扩展类型,将消息发送给用户以获取禁用文件。

于 2013-06-28T10:36:15.723 回答