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

Is it possible to emulate `git add -A` in GitPython?

我最近发现 GitPython,并且考虑到我目前正在尝试创建一个 Python 脚本自动推送到 Git 个存储库并从中提取,我真的很高兴尝试一下。

当使用命令行 Git 提交到存储库时,我调用 git add -A,几乎排除了所有其他参数。我知道您可以改为调用 git add .,或按名称调用 add/remove 文件;我只是从来没有觉得需要使用该功能。 (这对我来说是不好的做法吗?)但是,我今天一直在尝试编写一个 GitPython 脚本,尽管梳理了 the API reference,我还是找不到模拟 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'。我知道 .add() 要我指定要按名称添加的文件,但 GitPython 的全部意义在于,从我的角度来看,它是 自动化!必须手动命名文件违背了模块的目的!

是否可以在GitPython中模拟git add -A?如果可以,怎么做?

您链接的 API 转到支持 invoking the Git binaries themselves directly 的 GitPython 版本,因此您可以直接使用它 运行 git add -A 给你。

除此之外,git add -A means:

Update the index not only where the working tree has a file matching <pathspec> but also where the index already has an entry. This adds, modifies, and removes index entries to match the working tree.

If no <pathspec> is given when -A option is used, all files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).

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

This option is primarily to help users who are used to older versions of Git, whose "git add <pathspec>…​" was a synonym for "git add --no-all <pathspec>…​", i.e. ignored removed files.

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

如果您打算在 GitPython 内完成所有这些操作而不使用 git.cmd.Git class,我还要补充一点,根据我的经验,各种Python Git 的位的实现在它们对诸如 --no-all 之类的繁琐问题的保真度上有所不同(and/or 它们映射到 pre-2.0 Git,post -2.0 Git、post-2.23 Git 等),因此如果您打算 依赖 这些行为,您应该测试它们。