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

问题描述 投票:5回答:2

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

我正在尝试对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,分别。

python git git-commands
2个回答
4
投票

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

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

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

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


2
投票

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

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

博客文章综述:

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

事实证明gitlibrary of shell functions为此提供了明确的$(git --exec-path)/git-sh-setup。在您自己的shell脚本中使用它,例如:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.