在 GitPython 中签出或列出远程分支

问题描述 投票:0回答:8

我在此模块中没有看到用于签出或列出远程/本地分支的选项:https://gitpython.readthedocs.io/en/stable/

python git gitpython
8个回答
22
投票

对于那些只想打印远程分支的人:

# Execute from the repository root directory
repo = git.Repo('.')
remote_refs = repo.remote().refs

for refs in remote_refs:
    print(refs.name)

18
投票

要列出您可以使用的分支:

from git import Repo
r = Repo(your_repo_path)
repo_heads = r.heads # or it's alias: r.branches

r.heads
返回
git.util.IterableList
(继承于
list
)个
git.Head
对象,因此您可以:

repo_heads_names = [h.name for h in repo_heads]

并结账,例如。

master

repo_heads['master'].checkout() 
# you can get elements of IterableList through it_list['branch_name'] 
# or it_list.branch_name

问题中提到的模块是

GitPython
,它从gitorious
移动
Github


9
投票

完成后

from git import Git
g = Git()

(可能还有一些其他命令将

g
初始化到您关心的存储库)
g
上的所有属性请求或多或少都会转换为对
git attr *args
的调用。

因此:

g.checkout("mybranch")

应该做你想做的事。

g.branch()

将列出分支。但是,请注意,这些是非常低级的命令,它们将返回 git 可执行文件将返回的确切代码。因此,不要期望有一个漂亮的列表。我只是一个由多行组成的字符串,其中一行的第一个字符是星号。

图书馆可能有更好的方法来做到这一点。例如,在

repo.py
中有一个特殊的
active_branch
命令。您必须稍微浏览一下源代码并自行查找。


5
投票

我也有类似的问题。就我而言,我只想列出本地跟踪的远程分支。这对我有用:

import git

repo = git.Repo(repo_path)
branches = []
for r in repo.branches:
    branches.append(r)
    # check if a tracking branch exists
    tb = t.tracking_branch()
    if tb:
        branches.append(tb) 

如果需要所有远程分支,我更喜欢直接运行 git:

def get_all_branches(path):
    cmd = ['git', '-C', path, 'branch', '-a']
    out = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
    return out

4
投票

为了显而易见 - 从当前存储库目录中获取远程分支列表:

import os, git

# Create repo for current directory
repo = git.Repo(os.getcwd())

# Run "git branch -r" and collect results into array
remote_branches = []
for ref in repo.git.branch('-r').split('\n'):
    print(ref)
    remote_branches.append(ref)

1
投票

基本上,使用 GitPython,如果您知道如何在命令行中执行此操作,但不知道如何在 API 中执行此操作,只需使用 repo.git.action("your command withoutleading 'git' and 'action'"),例如: git log --reverse => repo.git.log('--reverse')

在这种情况下https://stackoverflow.com/a/47872315/12550269

所以我尝试这个命令:

repo = git.Repo()

repo.git.checkout('-b', local_branch, remote_branch)

此命令可以创建一个新的本地分支名称

local_branch
(如果已经有,会出现rasie错误)并设置为跟踪远程分支
remote_branch

效果非常好!


0
投票

我在这里采取了稍微不同的方法,基于获得可以检查的分支列表的愿望:

repo = git.Repo(YOUR_REPO_HERE)
branch_list = [r.remote_head for r in repo.remote().refs]

与使用

refs.name
的答案不同,这会获取不带远程前缀的名称,采用您想要用来查看存储库的形式。


0
投票

需要注意的是,您的本地 git 可能不会自动删除它正在跟踪的远程分支。这段代码说明了这个问题:

ls_remotes = git_repo.git.ls_remote(heads=True)
print(len(ls_remotes.split("\n")))

remote_references = [ref.name for ref in git_repo.remote().refs]
print(len(remote_references))

除非您修剪了遥控器,否则第一个打印可能会比第二个打印返回更多的分支。

如果你想确保本地 git 没有孤立的远程分支,你可以使用其中一个(或各种配置选项):

git fetch --prune
git remote update --prune
© www.soinside.com 2019 - 2024. All rights reserved.