Git:如何处理不同的shebang

12

人们如何处理本地和远程之间不同的 shebang 呢?

比如,我的本地 Python 路径是 /usr/bin/python,而我的网络主机上的 Python 是一个特定目录下的 ~/local/bin/python。一位首席开发人员可能在 /usr/bin/ruby 上有 Ruby,而我却在 /usr/local/bin/ruby 上安装了 Ruby。

我手动编辑 shebang,但是 git 把它标记为更改。理想情况下,我希望 git 忽略文件的第一行,或者忽略文件内的正则匹配。

我觉得这必须是一个非常普遍的问题,但我找不到任何相关的内容。

我使用 git,但我不会自称是专家。


6
这不是 #!/usr/bin/env python 的作用吗? - coreyward
@coreyward:请参考这个问题我的回答,讨论#!/usr/bin/env的hack技巧的优缺点。 - Keith Thompson
3个回答

18

将其更改为

#!/usr/bin/env python
或者
#!/usr/bin/env ruby

只要您的系统中安装了 Python 和 Ruby,并将其添加到 PATH 环境变量中,那么这段代码应该可以在所有系统上正常运行。


路径是个问题。我在我的网络主机上有一个位于~/local/bin/python的自定义Python,但是我不能更改Web服务器的路径因为我没有root权限。这很烦人,每次进行推送或拉取时都必须更改shebang。 - Nick Coleman
我想我的真正问题是“Git能否在行级别上实现原子性”,答案是“不行,它只能在文件级别上实现原子性”。 - Nick Coleman
你可能不需要root权限。你是如何运行这个脚本的?通过命令行?通过网页?还是通过Cron? - Mikel
这是通过网页进行的。我也有shell访问权限,可以通过命令行运行以进行测试。 - Nick Coleman
Apache?PHP?Ruby?一般回答:调用env PATH=$PATH:/home/user/local/bin scriptname而不是仅仅使用scriptname - Mikel
显示剩余2条评论

5
你的问题的解决方案是使用git的smudge/clean过滤器规则。这允许你设置过滤器,在检出时修改文件并在签入时撤消这些更改。下面是一个不错的图示:
首先,在你的.git/config中添加一些可以在两个方向上进行更改的过滤器。smudge过滤器将repo中的文件转换为工作副本,clean过滤器撤消该更改。重要的是,运行smudge -> clean应该恰好产生原始文件。这里提供的过滤器将在工作副本中用#!~/local/bin/python替换第一行,如果repo中是#!/usr/bin/env python
[filter "pyshebang"]
    smudge = sed '1s?^#!/usr/bin/env python$?#!~/local/bin/python?'
    clean = sed '1s?^#!~/local/bin/python$?#!/usr/bin/env python?'

现在,通过添加以下一行到.git/info/attributes(如果不存在,请创建该文件),激活此过滤器:
*.py filter=pyshebang

如果你的Python文件不以.py结尾,只需在正确的文件/整个文件夹/所有文件上配置过滤器。如果正确设置过滤器,它将仅更改带有Python shebang的文件。
我建议阅读smudge filters,以了解正在进行的详细信息。

涉及编程的内容翻译如下:Smudge滤镜文档的URL已更改为:https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#_keyword_expansion - ericx

0

这应该放在注释中,但我还没有足够的声望...当你从命令行运行它时,你可以只删除哈希符号并始终使用python运行它...也许...


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