Клонировать репозиторий со всей веткой из удаленного репозитория с помощью GitPython

Я пытаюсь сделать небольшую программу для своих пользователей для основных действий для git и других. И у меня много проблем с клонированием частного удаленного репозитория.

У меня есть следующая конфигурация: Python 3.4 Windows GitPython Ssh-соединение, установленное на удаленном сервере.

Вот мой код:

print(blue + "Where to clone repos ?")
path_repo = input(cyan + "> " + green)
try:
    assert os.path.exists(path_repo)
except AssertionError:
    print(red + "Path does not exist")
continue
print(blue + "Name of Repos :")
name_repo = input(cyan + "> " + green)
remote_path = "git@dev01:/home/git/repos/{0}.git".format(name_repo)
local_path = "{0}/{1}".format(path_repo, name_repo)
# Repo.clone_from(remote_path, local_path)
repo = Repo.clone_from(remote_path, local_path)
#print(repo.git.fetch())
#print(repo.git.pull())
#print(repo.git.status())

Это не вызывает ошибку, но скрипт останавливается в конце и блокирует терминал (дайте мне бесконечную пустую строку без >>>)

После этого, если я зайду в Git Bash и наберу git status, у него, похоже, не будет созданной ветки, просто init. Поэтому я добавляю 3 последние строки своего кода, чтобы увидеть, что изменилось, но ничего.

Если в Git Bash я наберу git pull, он хорошо потянет основную ветку...

Если кто-то может решить мою проблему, пожалуйста?

Где я сделал ошибку?

Спасибо


person Algorys    schedule 11.03.2015    source источник


Ответы (1)


Есть много проблем с кодом и подходом, который вы описываете...

Один

Прежде всего, у вас есть

continue

написано прямо в середине вашего кода... Поэтому я предполагаю, что код, который вы предоставили, находится в каком-то цикле. Весь код после безусловного continue в цикле является мертвым кодом - он никогда не будет выполнен.

Поэтому кажется, что вы никогда ничего не клонируете...

Два

Чтобы увидеть все ветки в репо, используйте что-то вроде git branch -va. Боюсь, что git status не для этого.

Три

Поскольку у вас, похоже, уже есть инициализированное репо, вы не сможете клонировать его в то же место, потому что клонирование создает репо.

Четыре

Кроме того, нет смысла проверять, существует ли каталог, потому что git clone создает каталог, если он не существует.


Подводя итог, попробуйте этот простой код ниже. Я закомментировал строку, которая, вероятно, привела бы к ошибке из-за того, что репо уже существует.

print(blue + "Where to clone repo?")
path_repo = input(cyan + "> " + green)
print(blue + "Name of repo:")
name_repo = input(cyan + "> " + green)
remote_path = "git@dev01:/home/git/repos/{0}.git".format(name_repo)
local_path = "{0}/{1}".format(path_repo, name_repo)
#repo = Repo.clone_from(remote_path, local_path)
repo = Repo(local_path)
info = repo.remote('origin').fetch()
if not info:
    print('no fetch information')
for i in info:
    if i.note:
        print('fetched, note is: ' + i.note.strip())
    else:
        print('fetched, no note')
person mbdevpl    schedule 25.06.2015
comment
Насколько я вижу, вы не закончили отвечать на вопрос; как передать --all команде git clone. - person Marcos Dione; 31.07.2015
comment
Когда я делаю это: $ git clone -- (здесь нажмите вкладку 2 раза), я получаю это: --bare --local --no-hardlinks --reference --template= --branch --mirror --origin --shared --upload-pack --depth --no-checkout --quiet --single-branch, поэтому, как вы видите, опция --all не отображается. И когда я пытаюсь заставить это: $ git clone --all error: unknown option `all' ... нет такой опции. Подробнее здесь: git-scm.com/docs/git-clone Итак, что вы хотите добиться, предоставив несуществующую опцию git clone? - person mbdevpl; 01.08.2015
comment
Кроме того, в исходном вопросе нет ничего о флаге --all. Впрочем, для чего он вам нужен? Git по умолчанию извлекает все удаленные ветки, а затем, если вам нужна какая-либо из них, вы просто делаете git checkout some-branch. Если он не существует, но origin/some-branch существует, новая ветвь some-branch будет создана, проверена и будет отслеживать происхождение. - person mbdevpl; 01.08.2015
comment
Тот факт, что завершение с помощью табуляции в вашей оболочке не предоставляет параметр, на самом деле не означает, что этот параметр не существует. С другой стороны, вы правы, для clone нет варианта --all, и я принял его за вариант для push и pull. - person Marcos Dione; 04.08.2015