Как я могу преобразовать все удаленные ветви в локальном 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'