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