【问题标题】:Git: how to deal with different shebangGit:如何处理不同的shebang
【发布时间】:2011-06-30 06:26:00
【问题描述】:

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

例如,我的本地 python 是 /usr/bin/python,而我的网络主机是专门构建的 python,位于 ~/local/bin/python。主要开发人员可能在 /usr/bin/ruby 拥有 ruby​​,而我的则是 /usr/local/bin/ruby。

我手动编辑了 shebang,但随后 git 将其标记为更改。理想情况下,我希望 git 忽略文件的第一行,或者可能忽略文件中行的正则表达式匹配。

在我看来这一定是一个非常普遍的问题,但我找不到任何提及。

我使用 git,但无论如何我都不会称自己为专家。

【问题讨论】:

  • 这不就是#!/usr/bin/env python的用途吗?
  • @coreyward:请参阅this questionmy answer,了解#!/usr/bin/env hack 的优缺点。

标签: git shebang


【解决方案1】:

改成

#!/usr/bin/env python

#!/usr/bin/env ruby

那么它应该可以在你的所有系统上运行,前提是你的PATH 环境变量中有 python 和 ruby​​。

【讨论】:

  • 路径是问题所在。我在我的网络主机上的 ~/local/bin/python 中有一个定制的 python。因为我没有 root,所以我无法更改 Web 服务器的 PATH。每次拉或推时都必须更换shebang,这有点烦人。
  • [继续...] 我想我真正的问题是“git 是否可以在行级别成为原子”,答案是“不,它在文件级别是原子的”。
  • 你可能不需要root。你是如何运行脚本的?命令行?通过网页?通过 Cron?
  • 通过网页。我也有 shell 访问权限,可以在命令行运行它来测试它。
  • 阿帕奇? php?红宝石?一般回答:致电env PATH=$PATH:/home/user/local/bin scriptname 而不仅仅是scriptname
【解决方案2】:

这属于 cmets 但我还没有足够的声誉...当您从命令行运行它时,您可以删除哈希爆炸并始终使用 python 运行它...也许...

【讨论】:

    【解决方案3】:

    解决您的问题的方法是 git 的 smudge/clean 过滤规则。这允许您设置过滤器,在签出时修改文件并在签入时撤消这些更改。这是一个很好的图形:

    首先设置一个可以在两个方向上进行更改的过滤器,方法是向您添加类似以下内容.git/config。涂抹过滤器将 repo 中的文件转换为工作副本,而干净的过滤器撤消了该更改。重要的是运行 smudge -> clean 产生的正是原始文件。如果在 repo 中是 #!/usr/bin/env python,则此处给出的过滤器将在工作副本中将第一行替换为 #!~/local/bin/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,以了解正在发生的事情的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多