【问题标题】:How to invoke utility omeld (oitnb) from git如何从 git 调用实用程序 omeld (oitnb)
【发布时间】:2026-02-16 21:40:01
【问题描述】:

oitnb (https://pypi.org/project/oitnb/) 看起来像是 yapf 和 black 好的部分的组合。作者声称它解决了使用名为 omeld 的实用程序将旧修订(格式化之前)与格式化后提交的修订进行比较的问题。集成该实用程序的示例是针对 mercurial,我们使用的是 git。

我已尝试向

注册 omeld 实用程序
get config --global diff.tool /usr/local/bin/omeld

但确实让事情顺利进行,git 一直告诉它不知道 omeld。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: python git code-formatting oitnb


    【解决方案1】:

    您可以尝试使用下面显示的别名,但在这样做之前您应该升级到 oitnb>0.1.3 或使用以下替代 omeld.py

    import sys
    import os
    
    
    def main():
        # print('omeld:', os.getcwd(), sys.argv[1:])
        assert len(sys.argv) == 3, 'omeld: expecting two arguments'
        runs = 0
        for idx, arg in enumerate(sys.argv[1:]):
            assert os.path.exists(sys.argv[1]), f'omeld: parameter {idx}, cannot find "{arg}"'
            rp = os.path.realpath(arg)
            # check if you are on a temporary directory, so there is less chance to screw up
            if rp.startswith('/tmp/') or rp.startswith('/var/tmp/'):
                runs += 1
                os.system('oitnb -q ' + rp)
        if runs > 0:
            os.system('meld ' + ' '.join(sys.argv[1:]))
        else:
            print('could not run oitnb on "{}" or "{}"'.format(*sys.argv[1:]))
    
    
    if __name__ == '__main__':
        main()
    

    因为与oitnb=0.1.3 一起分发的版本如果将旧版本与当前状态进行比较,可以格式化源目录中的文件。在git 中,这似乎更频繁地发生(它似乎优化为不创建临时文件,即使例如,如果文件的当前版本自第二次修订以来没有更改)。

    别名:

    alias gomeld='git difftool --extcmd=/path/to/omeld -y'
    

    我已经考虑过更改配置,但也没有让它起作用。

    【讨论】:

    • 我在oitnb上发了另一个问题,你能看看吗?