Subversion中shell脚本的正确MIME类型

14
当我将一个Shell脚本(foo.sh)添加到Subversion时,默认情况下会将svn:mime-type设置为application/x-shellscript。由于这不是以text/开头的,因此diff和blame基本上会忽略该文件。我查看了官方的文本mime-type列表,但没有看到任何类似于Shell脚本的东西。
有什么好的值可以设置吗?
更新
根据下面的建议,我将mime-type设置为text/x-shellscript。然而,blame仍然认为它是二进制文件。
$ svn blame file.sh 
Skipping binary file: 'file.sh' 
$ svn proplist file.sh 
Properties on 'file.sh':
  svn:executable
  svn:mime-type 
$ svn propget svn:mime-type file.sh
 text/x-shellscript

还有什么其他的事情我需要做,才能让subversion相信它是一个文本文件吗?

3个回答

16

file工具使用`text/x-shellscript'用于shell脚本:

$ file --mime-type /tmp/test.sh
/tmp/test.sh: text/x-shellscript

2
有帮助,但需要澄清的是:是否返回 text/x-shellscript 完全取决于所讨论的文件的 _shebang 行_,而不是其文件名后缀(.sh),如果有的话。简而言之:shebang 行必须为 #!/bin/(sh|bash|csh|tcsh|ksh|zsh)(表示为正则表达式;不确定是否还有其他的);请注意,基于 #!/usr/bin/env 的 shebang 行是 不会 被识别的。如果不满足这些条件且文件是文本文件,则返回 text/plain - mklement0

1
自动属性是完全客户端功能。使用自动属性,您还可以定义|重新定义添加到Subversion存储库对象的某些属性(即,对于旧的添加,您必须重新定义错误的mime-type)
在您的Subversion的config文件中(与平台相关的位置)
  • [miscellany]部分取消注释# enable-auto-props = yes字符串
  • [auto-props]部分取消注释# *.sh = svn:eol-style=native;svn:executable并相应地进行编辑(删除不需要的内容,添加需要的内容,如svn:mime-type=text/plain
完成后,所有新的*.sh文件在存储库中将显示为text/plain。
但是,由于配置是客户端的,而且其中的更改不会在存储库中传播,任何其他Subversion客户端都将继续将*.sh文件添加为text/x-shellscript,除非您的更改不重复。

1
Subversion很少自己设置mime类型;要么是您的客户端自己设置的(在这种情况下,您可能需要调整其配置),要么某种标准svn自动属性处理正在运行(同样,您将需要进行调整-对于shell脚本,您还需要将svn:eol-style设置为LF;一些shell会拒绝DOS/Windows行结尾,并通过确保在任何地方都使用Unix行结尾来避免使用网络共享或某些Windows shell构建(例如Cygwin)时出现的问题)。
svn blame的问题在于该属性是有版本控制的。文件的任何修订版本在属性更改之前仍然是二进制的(因为mime类型不以text/开头),因此diffs(和blames)将无法轻松地针对那些修订版本工作。
我认为唯一的解决方法是让管理员修改存储库以删除“错误”的mime类型。
但是,作为解决方法,您应该能够向blame传递--force,告诉它将所有文件视为文本。

实际上,查看http://subversion.1072662.n5.nabble.com/svn-blame-not-working-for-files-which-had-binary-mime-type-in-a-previous-revision-td177847.html,最近的Subversion客户端会告诉您使用--force选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接