Как получить список веток репозитория с помощью Python

Я пытаюсь получить список всех веток, доступных в моем репозитории, с помощью Python с помощью этого кода:

import subprocess

branches = ["All"]
command = "git branch -r"
branch_list = subprocess.check_output(command)

for branch in branch_list:
   print branch
   branches.append[branch]

Я хочу иметь что-то вроде:

print branches[0] # is "All"
print branches[1] # is "branch1"
print branches[2] # is "branch2"
etc etc

но вместо этого у меня

print branches[0] # is "All"
print branches[1] # is "b"
print branches[2] # is "r"
print branches[3] # is "a"
print branches[4] # is "n"
print branches[5] # is "c"
print branches[6] # is "h"
etc etc

Спасибо за ваше время и вашу помощь

не называйте свою переменную list   —  person MagicaNexus    schedule 05.07.2019

^ В общем, воздержитесь от использования зарезервированных ключевых слов и встроенных функций в качестве имен переменных, так как это приведет к перезаписи встроенной функции вашим значением, нарушая код, который ожидает, что встроенная функция будет тем, чем она является на самом деле.   —  person MagicaNexus    schedule 05.07.2019

Я знаю, что это просто для примера   —  person MagicaNexus    schedule 05.07.2019

subprocess.check_output возвращает (многострочную) строку. Итерации по строке дают вам буквы …   —  person MagicaNexus    schedule 05.07.2019

См. также:  Как я могу использовать xargs для копирования файлов, в именах которых есть пробелы и кавычки?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 3
  1. MagicaNexus

    Заглянув в check_output документацию, мы Получаем обратно кучу байтов. Чтобы с ним было легче работать, мы можем его расшифровать. Затем, поскольку git branch -r выводит одну ветвь на строку, разделите строку на новые строки:

    branches = subprocess.check_output(command).decode().split('\n')
    

    НО я думаю, что есть еще более простой способ сделать это. Каждый отдельный объект в git соответствует некоторому файлу в каталоге .git. В этом случае вы можете найти свой список веток в .git/refs/heads:

    import os
    branches = os.listdir('.git/refs/heads')
    

    РЕДАКТИРОВАТЬ (2020/10/13): Я провел еще некоторое время с subprocess с момента написания этого ответа и хотел указать на вариант text (через subprocess.run):

    Если указано encoding или errors или text истинно, файловые объекты для stdin, stdout и stderr открываются в текстовом режиме с использованием указанной кодировки и ошибок или io.TextIOWrapper по умолчанию.

    Это означает, что вы можете записать выражение check_output как:

    branches = subprocess.check_output(command, text=True).split('\n')
    

    оставив кодирование и декодирование системе. Как вам больше нравится!

    Ваше решение отлично работает для меня, добавление .decode().split('\n') было хорошим способом сделать, большое спасибо от новичка в python;) person MagicaNexus; 05.07.2019

    Для вашего второго решения я работаю с репозиторием mutilple, поэтому мне нужно --git-dir= и --work-tree=, чтобы менять репо, когда я хочу, но спасибо за совет person MagicaNexus; 05.07.2019

    Каждый отдельный объект в git соответствует некоторому файлу в каталоге .git false. ссылки и объекты могут быть упакованы, person MagicaNexus; 13.10.2020

  2. MagicaNexus

    Попробуйте decode это:

    stdout = subprocess.check_output('git branch -a'.split())
    out = stdout.decode()
    branches = [b.strip('* ') for b in out.splitlines()]
    print(branches)
    

    выход:

    ['master', 'second', 'test']
    
  3. MagicaNexus

    Для python3,

    import subprocess
    
    # refs/remotes for remote tracking branches.
    # refs/heads for local branches if necessary, and
    # refs/tags for tags
    cmd = 'git for-each-ref refs/remotes --format="%(refname)"'
    status, output = subprocess.getstatusoutput(cmd)
    branches = ["All"]
    if status == 0:
        branches += output.split('\n')
    print(branches)
    

    Для python2 замените subprocess на commands.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: