是否可以在 GitPython 中模拟 `git add -A`?

问题描述

我最近发现了 gitpython,并且鉴于我目前正在尝试创建一个 Python 脚本,该脚本可以自动推送到 Git 存储库并从其中提取,我很高兴尝试一下。

当使用命令行 Git 提交到存储库时,我调用 git add -A,几乎排除所有其他参数。我知道您可以改为调用 git add .,或者按名称添加/删除文件;我从来没有觉得有必要使用该功能。 (这对我来说是不好的做法吗?)但是,我今天一直在尝试编写一个 gitpython 脚本,尽管梳理了 the API reference,但我找不到任何直接的方法来模拟 {{1 }} 命令。

这是我迄今为止努力的一个片段:

git add -A

这会引发以下错误repo = Repo(absolute_path) repo.index.add("-A") repo.index.commit("Commit message.") repo.remotes.origin.push() 。相反,如果我尝试调用 FileNotFoundError: [Errno 2] No such file or directory: '-A',我会得到:repo.index.add()。我知道 TypeError: add() missing 1 required positional argument: 'items' 想让我按名称指定要添加文件,但在我看来,gitpython 的全部意义在于它自动!必须手动命名文件违背了模块的目的!

是否可以在 gitpython 中模拟 .add()?如果是这样,如何?

解决方法

您链接的 API 转到支持 invoking the Git binaries themselves directly 的 GitPython 版本,因此您可以让它为您运行 git add -A

除此之外,git add -A means

不仅在工作树具有与 匹配的文件的地方更新索引,而且在索引已经有条目的地方更新索引。这会添加、修改和删除索引条目以匹配工作树。

如果在使用 -A 选项时没有给出 ,则整个工作树中的所有文件都将被更新(旧版本的 Git 用于限制对当前目录及其子目录的更新)。>

所以 git add -A 与工作树顶层的 git add . 相同。如果您想要旧的(2.0 之前的)git add -A 行为,请从工作树的较低级别运行 git add .;要获得 2.0 或更高版本的 git add -A 行为,请从工作树的顶层运行 git add .。但另请参阅--no-all

这个选项主要是为了帮助那些习惯了旧版本Git的用户,他们的“git add … ”是“git add --no-all … ”的同义词,即被忽略删除的文件。

因此,如果您想要 2.0 之前的行为,您还需要 --no-all

如果您打算在不使用 git.cmd.Git 类的情况下在 GitPython 中完成所有这些操作,根据我的经验,我还要补充一点,Git 位的各种 Python 实现在保真度上各不相同,例如 { {1}}(和/或它们到 2.0 之前的 Git、2.0 之后的 Git、2.23 之后的 Git 等的映射),因此如果您打算依赖这些行为,您应该测试