在我们的存储库中,来自不同操作系统的用户可以访问。其中一些人,通常是Windows用户,将各种文件检入 executable ,这对Unix用户来说很痛苦。
我认为Subversion中的一个设计缺陷是文件上svn:executable
的完全存在或不存在决定了可执行位而不是区分'忘记设置'和'它确实不可执行”。
无论如何,有没有办法在技术上解决这个问题,而不是社交问题?也许是一个commit-hook,或者是广泛传播的Windows subversion客户端(理想情况下是Eclipse)的配置条目?
答案 0 :(得分:2)
使用预提交挂钩检查文件名,然后根据文件扩展名修改可执行标记:
http://svnbook.red-bean.com/en/1.6/svn-book.html#svn.reposadmin.create.hooks
答案 1 :(得分:0)
使用Precommit钩子。 在precommit钩子里面,使用SVNLook,获取文件名,剪切扩展部分,根据你想要限制的扩展类型,给用户提供有关丢弃文件的消息。
答案 2 :(得分:0)
我认为Subversion中的设计缺陷是文件上svn:executable的完全存在或不存在决定了可执行位,而不是区分“忘记设置它”和“它确实不可执行”。
在Windows中,文件后缀确定是否可执行。将svn:executable
放在文件上对Windows没有任何影响,我无法理解为什么Windows用户为批处理文件执行此操作。它只是弄乱了Unix人的想法。
问题是Unix在确定文件可执行性时使用文件权限。可执行文件可以被调用任何东西,并且没有简单的方法来确定它,除了可执行文件具有此执行权限位设置。
Subversion仅使用svn: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会阻塞这些。< / p>
我有pre-commit hook可用于确保在文件上设置属性。我使用它来强制用户将svn:eol-style
= LF
放在shell脚本和Makefile上,或者在Windows批处理脚本上设置svn:eol-style
= CRLF
。您甚至可以使用它强制用户在文件上设置svn:executable
。例如,我们确保bin
目录中的所有文件或*.sh
中的所有文件都设置了此位。对我们来说,这应该是问题所在。不是,这个位已设置,它不应该是。
但是,此钩子中没有任何内容表示不设置此属性。但是,如果这对您很重要,您可以自由地使用此预提交钩子并对其进行修改。