Git、linux shell GitPython 的替代命令

Git, linux shell command alternatives for GitPython

我正在尝试获取所有合并的分支以及陈旧的分支(3 个月内未使用) 我有为 linux shell 编写的命令。但是,我需要在 Gitpyhon 中编写替代命令。有人可以帮我解决这个问题吗?

self.cmd("git branch --merged master") # <-- Display, merged branches
self.cmd(                              # <-- Display stale branches
    "for branch in `git branch -r | grep -v HEAD`;"
    "do echo -e `git log --before=\"3 months\" --no-merges"
    " -n 1 --format=\"%cr | %an | %ae | \""
    " $branch | head -n 1` \t$branch; done | sort -M"
)

这里有关于如何在 GitPython 中直接翻译 git 命令的提示。

  1. 始终使用 import git.
  2. 使用 g = git.Git() 创建一个 git 处理程序。
  3. 使用env = {'GIT_DIR': '/path/to/repo/.git', 'GIT_WORK_TREE': '/path/to/repo'}传递这两个变量,这样我们就可以在任何地方调用git命令。如果脚本涉及多个仓库,记得切换变量值。
  4. 对于命令,将 git foo 变为 g.foo(),将 git foo-bar 变为 g.foo_bar()。例如,git commit 等于 g.commit()git cherry-pick 等于 g.cherry_pick()
  5. 对于选项,将-f转为f=True-f b转为f=b--foo转为foo=True--foo-barfoo_bar=True--foo-bar=bazfoo_bar=baz.
  6. with_extended_output=True 传递给命令,以便我们可以捕获状态、标准输出和标准错误。
  7. 使用try...catch... 捕捉命令错误。请注意,当 stderr 不为空时,可能根本没有问题。即使命令成功,某些命令也会将结果打印到 stderr。
  8. 如果您不想进行翻译,请改为调用 g.execute()

现在试试你的命令。假设非裸存储库是 /path/to/repo.

import git
import logging

g = git.Git()
env = {'GIT_DIR': '/path/to/repo.git', 'GIT_WORK_TREE': '/path/to/repo'}
# git branch --merged master
try:
    status, stdout, stderr = g.branch(
        merged='master',
        env=env,
        with_extended_output=True)
    print(stdout.split('\n'))
except Exception as e:
    logging.exception(e)
    # more stuff

# git branch -r
stale_branches = []
try:
    status, stdout, stderr = g.branch(
        r=True,
        env=env
        with_extended_output=True)
    stale_branches += [l.strip() for l in stdout.split('\n')]
except Exception as e:
    logging.exception(e)
    # more stuff

for branch in stale_branches:
    if 'HEAD' in branch:
        continue
    # git log
    logs = []
    try:
        status, stdout, stderr = g.log(
            branch,
            before='3 months',
            no_merges=True,
            n=1,
            format='"%cr | %an | %ae | "',
            env=env,
            with_extended_output=True)
        logs += stdout.split('\n')
    except Exception as e:
        logging.exception(e)
        # more stuff

# leave the rest to you
        

对于某些命令,如 git worktree add --no-checkout foo HEADg.worktree('add', 'foo', 'HEAD', no_checkout=True) 总是失败,因为它调用了无效的命令 git worktree --no-checkout add foo HEAD。在这种情况下,我们可以使用 g.execute()。将整个命令转换为参数列表 ['git', 'worktree', 'add', '--no-checkout', 'foo', 'HEAD'],并将其传递给 g.execute().

try:
    status, stdout, stderr = g.execute(
        ['git', 'worktree', 'add', '--no-checkout', 'foo', 'HEAD'],
        env=env,
        with_extended_output=True)
    print(stdout)
except Exception as e:
    logging.exception(e)
    # more stuff