我觉得这个问题可以用一两个超链接来回答;我只是没有提出正确的搜索条件来自己查找这些链接...
我正在尝试对git p4
子命令进行一些小的更改,它被实现为一个名为/usr/libexec/git-core/git-p4
的3797行Python脚本。在深入探讨代码之前,我想了解Python git
命令的结构。
子命令从调用者那里得到什么信息?它可以依赖现有的环境变量?它是如何检测配置的(来自.git/config
和/或~/.gitconfig
)?如何从git
传递git命令行选项(如果有许多不同子命令共用的命令行选项,并且您希望确保它们的处理是集中的)?子命令启动时当前工作目录是什么?如果我改变cwd怎么办?我如何与git
沟通,它应该更改repo(提交,添加或删除标签,重写历史记录)作为我的新子命令功能的一部分?我的命令可以直接“处理”索引而无需创建工作树,如果是,如何?如何处理和报告错误?如何以一致的方式打印使用信息?
我假设必须有博客文章和关于这个主题的事情,但搜索“在python中编写一个git子命令”,“创建新的git子命令”等,只是提出了从Python运行现有git命令的方法以及创建新方法的方法git repos,分别。
Git的课程文件covers this。简短版本:
如果git foo
不是内置命令,Git将搜索PATH
以获取git-foo
并运行它。但它根本不做任何事情:它甚至不验证你是否在存储库目录中。 (毕竟,许多命令甚至不需要一个命令,如git hash-object
或git ls-remote
。)
虽然存在内部和外部API,但大多数新命令都是根据existing suite命令的git
编写的。它们是一切发生的方式,它们决定是否需要像工作副本这样的东西,或者索引是否足够。
在这样的情况下,“管道”命令通常变得很重要:根据我编写其中一些(并使用filter-branch
)的经验,cat-file
,commit-tree
,for-each-ref
,merge-base
,rev-list
和rev-parse
特别有用。显然它可能取决于你想做什么:其他人可能会发现各种(否则)瓷器命令的--cached
选项更相关。
以下是有关该主题的一些帖子。执行摘要是,似乎没有“官方”方式从Python访问git配置,操纵repo等 - 实际上git
根本没有兴趣正式支持Python,因为担心可移植性。有一些“官方”方式可以通过git-sh-setup
在shell中做一些事情。
用于git子命令的另一种“官方”语言是Perl。我不知道是否有任何针对Perl的git相关子程序的“官方”库。
博客文章综述:
git activity
,在shell中)git validate
,在壳中)git unstash
,在壳中)Jeff Remer at Coderwall解释说,如果有人愿意用shell而不是Python编写,那么我正在寻找的一些API确实存在:
事实证明
git
在library of shell functions为此提供了明确的$(git --exec-path)/git-sh-setup
。在您自己的shell脚本中使用它,例如:source "$(git --exec-path)/git-sh-setup"
之后,您将可以访问一些shell函数,这些函数执行有用的操作和健全性检查,或者允许您访问git信息,例如方便的
usage
和die
方法。
所以看起来如果你用Python编写,你就可以自己动手 - 这意味着如果我想了解它们推出的特定方式,我必须深入阅读git-p4
源代码。
至于是否可以在没有工作树的情况下操纵仓库和创建历史:我还不知道。