Как я могу преобразовать все удаленные ветви в локальном git-репо в локальные ветви отслеживания

Как я могу преобразовать все удаленные филиалы в локальном git-репо в локальные отслеживающие ветви, не проверяя каждую по одному.

Одна из причин, почему вы можете захотеть сделать это (причина, по которой я хочу это сделать), заключается в том, что вы можете взять клон локального репо и иметь в этом новом клоне все ветви из исходного удаленного источника.

Потому что "клон" только клонирует локальные филиалы.

Редактировать: была предоставлена ​​пара скриптовых ответов (за что - спасибо!) ... Я действительно надеялся на способ git, чтобы он был полностью переносимым (у меня есть пользователи, которые "только для Windows", и так далеко выжили без использования bash (git-bash или иным образом).

4 ответа

Решение

Лучший способ сделать это, вероятно, с помощью скрипта:

#!/bin/bash
IFS=$'\n'
for branch in `git branch -r`; do
    if [[ ${branch} =~ ^\ *(.+)/(.+)$ ]]; then
        git show-branch "${BASH_REMATCH[2]}" > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            git branch ${BASH_REMATCH[2]} ${BASH_REMATCH[1]}/${BASH_REMATCH[2]}
        fi
    fi
done

Этот ответ был предоставлен мне jast на #git на freenode:

git push . refs/remotes/origin/*:refs/heads/*

Примечание: как упоминалось в комментарии ниже, это не создает отслеживающие ветви, хотя по крайней мере делает ветви в локальном репо "локальными" и отмечает "удаленные".

Я думаю, что ответ @cforbish можно улучшить, только сказав, что с этим сценарием вы должны создавать такие команды:

# git branch <local-branch-name> <remote-name>/<remote-branch-name>

Например, если у вас есть следующие удаленные ветви:

# git remote -v
  remote-repo <repo-directory> (fetch)
  remote-repo <repo-directory> (push)
# git branch -r
  remote-repo/branch1
  remote-repo/branch2
  remote-repo/branch3

Вы можете иметь свои локальные ветви отслеживания, запустив:

# git branch branch1 remote-repo/branch1
# git branch branch2 remote-repo/branch2
# git branch branch3 remote-repo/branch3
# git branch
  branch1
  branch2
  branch3

Мне нравятся сборщики команд-оболочек для подобных вещей. Это уродливее, чем в более ранней версии, но оно также работает на пустых оболочках и имеет дополнительное преимущество, заключающееся в том, что аргументы команд ветвления создаются в правильном порядке, чтобы они действительно работали.

Одна вещь - такие сценарии являются "решениями в git".

git-track-all-remote-branches () 
{ 
    awk '
     $0=="////"{doneloading=1;next}
     !doneloading {drop[$0]=1;next}
     !drop[$0] {
            print "b='\''"$0"'\''; git branch -t ${b##*/} $b"
     }'  <<///EOD///
$(git for-each-ref --format="%(upstream:short)" refs/heads)
////
$(git for-each-ref --format="%(refname:short)" refs/remotes)
///EOD///

}

Довольно недавний checkout особенность в том, что если вы извлекаете пустое имя, которое в данный момент не является ветвью, но соответствует ровно одной удаленной ветке, оно автоматически настроит для него ветвь отслеживания:

$ git branch
  master
$ git branch -r
  origin/notyet
  origin/master
$ git checkout notyet
Checking out files: 100% (2/2), done.
Branch notyet set up to track remote branch notyet from origin.
Switched to a new branch 'notyet'
Другие вопросы по тегам