23

I don't see an option to checkout or list remote/local branches in this module: https://gitpython.readthedocs.io/en/stable/

8 Answers 8

23

For those who want to just print the remote branches:

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

for refs in remote_refs:
    print(refs.name)
Sign up to request clarification or add additional context in comments.

Comments

18

To list branches you can use:

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

r.heads returns git.util.IterableList (inherits after list) of git.Head objects, so you can:

repo_heads_names = [h.name for h in repo_heads]

And to checkout eg. master:

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

Module mentioned in the question is GitPython which moved from gitorious to Github.

1 Comment

Looks like its documented here: gitpython.readthedocs.io/en/stable/…
9

After you’ve done

from git import Git
g = Git()

(and possibly some other command to init g to the repository you care about) all attribute requests on g are more or less transformed into a call of git attr *args.

Therefore:

g.checkout("mybranch")

should do what you want.

g.branch()

will list the branches. However, note that these are very low level commands and they will return the exact code that the git executables will return. Therefore, don’t expect a nice list. I’ll just be a string of several lines and with one line having an asterisk as the first character.

There might be some better way to do this in the library. In repo.py for example is a special active_branch command. You’ll have to go through the source a little and look for yourself.

2 Comments

when i run r = Git.clone("git ...") r.checkout("develop") does not work.. AttributeError: 'str' object has no attribute 'checkout'
ok looks like I need to run a g = Git("dir") then I can checkout
5

I had a similar issue. In my case I only wanted to list the remote branches that are tracked locally. This worked for me:

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) 

In case all remote branches are needed, I would prefer running git directly:

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

1 Comment

If you already have a Repo instance, you can call git commands directly as: repo.git.branch('-a')
4

Just to make it obvious - to get a list of remote branches from the current repo directory:

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)

Comments

1

Basically, with GitPython, if you know how to do it within command line, but not within the API, just use repo.git.action("your command without leading 'git' and 'action'"), example: git log --reverse => repo.git.log('--reverse')

in this case https://stackoverflow.com/a/47872315/12550269

So I try this command:

repo = git.Repo()

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

this command can make a new local branch name local_branch(if already haved, rasie error) and set up to track remote branch remote_branch

it works very well!

Comments

0

I took a slightly different approach here, based on the desire to obtain a list of branches that can be checked out:

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

Unlike the answer using refs.name, this obtains the name without the remote prefix, in the form you would want to use to check out the repository.

Comments

0

Something to be aware of when listing remote branches is that your local git may not be automatically removing the remote branches it is tracking. This code illustrates the issue:

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))

Unless you have pruned your remotes the first print will likely return more branches than the second.

If you want to ensure your local git does not have orphaned remote branches you can use either of these (or various config options):

git fetch --prune
git remote update --prune

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.