将新的“git ...”子命令实现为Python脚本

时间:2018-03-02 18:24:24

标签: python git git-commands

我觉得这个问题可以通过一个或两个超链接来回答;我只是没有提出正确的搜索条件来自己找到这些链接......

我正在尝试对git p4子命令进行一些小的更改,该子命令是作为名为/usr/libexec/git-core/git-p4的3797行Python脚本实现的。在深入探讨代码之前,我想了解一下Python git命令的结构。

子命令从调用者那里得到什么信息?它可以依赖现有的环境变量?它如何检测配置(来自.git/config和/或~/.gitconfig)?如何从git传递git命令行选项(如果有许多不同子命令共用的命令行选项,并且您希望确保它们的处理是集中的)?子命令启动时当前工作目录是什么?如果我更改 cwd会怎样?作为新子命令功能的一部分,如何与git进行通信,以便更改回复(提交,添加或删除标记,重写历史记录)?我的命令可以直接“处理”索引而无需创建工作树,如果是,如何?如何处理和报告错误?如何以一致的方式打印使用信息?

我认为必须有关于这个主题的博客文章和内容,但是搜索“在python中编写一个git子命令”,“创建新的git子命令”等等,只是找到了从Python运行现有git命令的方法和方式分别创建新的git repos。

2 个答案:

答案 0 :(得分:4)

Git的课程文档covers this。简短版本:

如果git foo不是内置命令,Git会搜索PATH git-foo并运行该命令。但它根本不做任何事情:它甚至不会验证你是否在存储库目录中。 (毕竟,许多命令甚至不需要一个,如git hash-objectgit ls-remote

虽然存在内部和外部API,但大多数新命令都是根据existing suite git命令编写的。它们是一切发生的方式,它们决定是否需要像工作副本这样的东西,或者索引是否足够。

在这样的情况下,“管道”命令通常变得很重要:根据我的经验写一些(并使用filter-branch),cat-filecommit-tree,{{ 1}},for-each-refmerge-baserev-list特别有用。显然它可能取决于你想做什么:其他人可能会发现各种(否则)瓷器命令的rev-parse选项更相关。

答案 1 :(得分:2)

以下是有关该主题的一些帖子。执行摘要是,似乎没有“官方”的方式从Python访问git配置,操纵repo等 - 实际上git根本没有兴趣正式支持Python,因为担心可移植性。有一些“官方”方式在shell中做一些事情,可以通过git-sh-setup获得。

git子命令的另一种“官方”语言是Perl。我不知道Perl是否有任何与git相关的子程序的“官方”库。

博客文章综述:

Jeff Remer at Coderwall解释说,如果有人愿意用shell而不是Python编写,我正在寻找的一些API事项:

  

结果git$(git --exec-path)/git-sh-setup明确为此目的提供了library of shell functions。在您自己的shell脚本中使用它,如:

source "$(git --exec-path)/git-sh-setup"
     

之后,您将可以访问一些执行有用操作和健全性检查的shell函数,或者访问git信息,例如方便的usagedie方法。

所以看起来如果你用Python编写,你可以自己动手 - 这意味着如果我想了解它们推出的特定方式,我必须深入阅读git-p4源代码。

关于是否可以在没有工作树的情况下操纵仓库并创建历史记录:我还不知道。