Вопрос по git, git-branch, branch – Как получить все ветки Git

1129

Я клонировал Git-репозиторий, который содержит около пяти веток. Тем не менее, когда я делаюgit branch Я вижу только один из них:

$ git branch
* master

Я знаю, что я могу сделатьgit branch -a видетьall ветви, но как бы я потянул все ветви локально, чтобы, когда я делаюgit branch, это показывает следующее?

$ git branch
* master
* staging
* etc...
@GabrielFerraz Тогда вы злоупотребляете функциональностью комментариев в переполнении стека. Пользователи могут проголосовать за ваш комментарий, но не за него. pipe
Вы никогда не увидите этот вывод, потому что звездочка представляет ветку, которая в настоящее время извлекается. Поскольку вы можете получить только одну ветку за раз, у вас может быть только одна звездочка слева от вашего списка ветвей. Robino
Также обсуждается наstackoverflow.com/questions/67699/… gliptak
Этот вопрос показывает, как получить все ветви после использования--single-branch установка при клонировании:stackoverflow.com/questions/17714159/… (git fetch --all никогда не будет работать, если вы указали только одну ветку!) Matthew Wilcoxson
Я видел много ответов, но ни один из них не упомянул, что я думаю, возможно, самый простой способ сделать то, что вы хотите:git clone --bare <repo url> .git  (обратите внимание, что вам нужно добавить «- bare» и «.git» в конце, чтобы клонировать репо как «bare» репо), затемgit config --bool core.bare false (устанавливает флаг «голый» в значение false), затемgit reset --hard (перемещает ГОЛОВКУ к текущей ГОЛОВКЕ в репо). Теперь, если выgit branch Вы должны увидеть все ветви репо, который вы клонировали. Gabriel Ferraz

Ваш Ответ

25   ответов
24

git fetch origin
git checkout --track origin/remote-branch

Немного более короткая версия:

git fetch origin
git checkout -t origin/remote-branch
git fetch origin перед проверкой сделал трюк для меня.
45

git fetch && git checkout RemoteBranchName.

Это работает очень хорошо для меня ...

Именно то, что я хотел! Нечто простое!
Это более простой и безопасный метод.
Это был единственный ответ, который позволял мне тянуть удаленные ветви в каждой ситуации, с которой я столкнулся
Это не отвечает на первоначальный вопрос: "Как бы я вытащил все ветви локально?" Он вытягивает их один за другим, что не масштабируется.
Это новый лучший ответ, все. Я не знаю, возможно ли это было возможно раньше, но последние версии Git по крайней мере заметят, что вы пытаетесь оформить удаленную ветку, и автоматически настроят для вас локальную ветку отслеживания (и вам это не нужно). указатьorigin/branch; достаточно сказать толькоbranch).
3

Doesn't update remote tracking for existing branches Doesn't try to update HEAD to track origin/HEAD Allows remotes named other than origin Properly shell quoted
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Нет необходимостиgit fetch --all как проходящий-all вgit pull передает эту опцию на внутреннийfetch.

Кредит дляэтот ответ.

Работает угощение! Должно быть больше голосов.
7

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard
Это на самом деле корень проблемы OP. Если клонировать правильно, ему не нужно делатьpull --all, Но если все еще нужно, то другой ответ ниже, @Johnno Nola, предполагая, что все ответвления отслеживаются и смешиваются с этим ответом, - это путь.
0

git clone [...] а такжеcd-вхождение в созданный каталог:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Работал для меня, но я не могу знать, что это будет работать для вас. Быть осторожен.

1510

git fetch --all

fetch обновляет локальные копии удаленных филиалов, так что это всегда безопасно для ваших локальных филиаловBUT:

fetch will not update local branches (which track remote branches); if you want to update your local branches you still need to pull every branch.

fetch will not create local branches (which track remote branches), you have to do this manually. If you want to list all remote branches: git branch -a

кupdate местные филиалы, которые отслеживают удаленные филиалы:

git pull --all

Однако этого может быть недостаточно. Это будет работать только для ваших локальных филиалов, которые отслеживают удаленные филиалы. Для отслеживания всех удаленных веток выполните этот onelinerBEFORE git pull --all:

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
TL;DR version
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

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

Выполняйте первую команду, только если на сервере есть удаленные ветви, которые не отслеживаются вашими локальными филиалами.

Постскриптум насколько мне известноgit fetch --all а такжеgit remote update эквивалентны.

Камил Сзоткомментарий, что 74 (по крайней мере) люди нашли полезным.

I had to use:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

because your code created local branches named origin/branchname and I was getting "refname 'origin/branchname' is ambiguous whenever I referred to it.

эта выборка не создаст новую удаленную ветку, вам все равно нужно проверить ее с помощьюgit checkout -b localname remotename/remotebranch
Я должен был использоватьfor remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done   потому что в вашем коде были созданы локальные ветки с именем origin / branchname, а я получал "refname" origin / branchname & apos; неоднозначно всякий раз, когда я упоминал об этом.
Для пользователей Windows:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Я не знаю, использую ли я другую версию GIT, но мне пришлось изменить сценарий, чтобыgit pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done, Изменение снимает ГОЛОВУ.
Сожалею. Я не могу себе представить, что именно этого на самом деле хочет ОП. «Тянуть» команда 'fetch + merge' и часть слияния будет перекрывать все ветви друг на друге, оставляя один гигантский беспорядок.
20

Вы можете получить все ветви:

git fetch --all

или же:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

The --depth=10000 parameter may help if you've shallowed repository.

Чтобы вытащить все ветви, используйте:

git pull --all

Если вышеприведенное не сработает, то перед вышеуказанной командой введите:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

какremote.origin.fetch может поддерживать только определенную ветку при получении, особенно когда вы клонировали свой репозиторий с--single-branch, Проверьте это по:git config remote.origin.fetch.

После этого вы сможете оформить заказ в любом отделении.

Смотрите также:

How to fetch all remote branches? How to clone all remote branches in Git?

Чтобы передать все ветви на удаленный доступ, используйте:

git push --all

в конце концов--mirror чтобы отразить все ссылки.

Если ваша цель - дублировать репозиторий, см.Дублирование репозитория статья на GitHub.

pull --all тянет не все ветви, а все пульты
Круто ... Я попробовал все остальное до вашего решения на этой странице. Большое спасибо!
Я использовал мелкое клонирование (depth=1) и конфиг также указал одну конкретную ветку дляfetch -depth=1000 Параметр был исправлением, которое помогло мне проверить конкретную удаленную ветку
Хороший трюк с конфигом, хотя! Принесу их всех, все время
4

создания локальных веток для всех удаленных веток.

Вы можете найти последнюю версиюВот:

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "[email protected]" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Чтобы использовать его, просто скопируйте его в каталог git bin (для меня это & # x2019; sC:\Program Files (x86)\Git\bin\git-cloneall), то в командной строке:

git cloneall [standard-clone-options] <url>

Он клонируется как обычно, но создает локальные ветви отслеживания для всех удаленных ветвей.

14

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

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>
Я удалил антипаттерн запуска grep, затем awk и сжал команды grep в команду awk. Спасибоtripleee!
Очень полезно; именно то, что мне было нужно. Единственное, что я должен был изменить, было во второй строке, добавив одинарные кавычки вокруг «HEAD». и «мастер»; вероятно, потому что я использую zsh. Спасибо!
Гитpull действительно делаетfetch во-первых, но легче определить, является ли проблемаfetch частьpull или последующийmerge частьpull когдаfetch выполняется самостоятельно.
Это в основном делает следующее: (1) Получение фактических имен удаленных веток [не руководитель, не мастер]; (2) Полностью сказать Git, чтобы отслеживать их [не все решения делают это]; (3) Извлечение и извлечение всего из этих веток [включая теги]; (4) Установка нового источника и прохождение толкают абсолютно все. Опять же, большинство других решений не могут сдвинуть все части. Это делает все это.
Прочитайте это и никогда не пишитеgit fetch git pull stackoverflow.com/a/292359/1114926
1

а затем выполнить git pull для каждого имени / тега:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done
28

вся информация о ветвях фактически загружается, но ветви скрыты. С помощью команды

$ git branch -a

Вы можете показать все ветви хранилища, и с помощью команды

$ git checkout -b branchname origin/branchname

затем вы можете «скачать» их вручную по одному.

Однако есть намного более чистый и быстрый способ, хотя он немного сложен. Вам нужно три шага для этого:

First step

create a new empty folder on your machine and clone a mirror copy of the .git folder from the repository:

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

the local repository inside the folder my_repo_folder is still empty, there is just a hidden .git folder now that you can see with a "ls -alt" command from the terminal.

Second step

switch this repository from an empty (bare) repository to a regular repository by switching the boolean value "bare" of the git configurations to false:

$ git config --bool core.bare false

Third Step

Grab everything that inside the current folder and create all the branches on the local machine, therefore making this a normal repo.

$ git reset --hard

Так что теперь вы можете просто набрать командуgit branch и вы можете видеть, что все ветви загружены.

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

Проголосовал за упоминание скрытых веток. помог мне понять локальное отслеживание филиалов безмерно.
Это хороший ответ, но вопрос подразумевает что-то для повседневного использования. Непрактично клонировать хранилище каждый раз.
Почему сброс создает все ветви локально?
54
$ git remote update
$ git pull --all

Если это не так, вы можете запустить это в Bash:

for remote in `git branch -r `; do git branch --track $remote; done

Затем запустите команду.

Когда я пытаюсь это сделать, я все равно получаю тот же результат, что и выше. David542
Так же, как @JacobLowe, я получил ошибку, но она все равно сработала; «фатальный»: ветвь с именем «происхождение / хозяин»; уже существует.
Кроме того, это не работает. Я получаю вывод:Branch 'origin/quote-filenames' set up to track local branch 'master'.  Желаемый результат:Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'.  Этоbackwards, установив источник для отслеживания пульта. Увидетьthis answer для исправления.
последний работал для меня .. с несколькими ошибками Git
Это безобразно, так как попытается создать ветку для-> который, вероятно, будет существовать в выводеgit branch -r как `origin / HEAD - & gt; Происхождение / master`
2

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all
Команда будет игнорировать ветвь с именем & quot; / & quot;
104

Если вы делаете:

git fetch origin

тогда они будут все там локально. Если вы затем выполните:

git branch -a

вы увидите их в списке как remotes / origin / branch-name. Так как они есть на месте, вы можете делать с ними все, что угодно. Например:

git diff origin/branch-name 

или же

git merge origin/branch-name

или же

git checkout -b some-branch origin/branch-name
Исправлено (устранено--all)
git fetch -all выбирает все ветви всех пультов.git fetch origin извлекает все ветки пультаorigin, Последнее - то, о чем спрашивал ОП.
Только что нашел эту страницу в Google ... это был реальный тип ответа, который я искал. Я попробовал первую команду, но получил ошибку: [$ git fetch - все происхождение фатально: fetch - все не принимает аргумент хранилища] --- Использование & quot; git fetch --all & quot; кажется, добивается цели. Спасибо за лидерство!
Это не способ вытащить все ветви в локальное репо из удаленного репо.
--all означает «все пульты», а не «все ветви данного пульта». Последнее подразумевается любой выборки с пульта.
1

Если у вас есть проблемы сfetch --all затем отследите свою удаленную ветку:

git checkout --track origin/%branchname%
14

git clone https://github.com/pathOfrepository

Теперь перейдите в эту папку с помощью CD:

cd pathOfrepository

Если вы печатаетеgit status Вы можете увидеть все:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Чтобы увидеть все скрытые типы веток:

 git branch -a

В нем будут перечислены все удаленные ветви.

Теперь, если вы хотите оформить заказ на какую-либо конкретную ветку, просто наберите:

git checkout -b localBranchName origin/RemteBranchName
527


git branch -r

Вы можете проверить их как местные филиалы с:
git checkout -b LocalName origin/remotebranchname

Принятый ответ делает что-то принципиально другое, и, честно говоря, я даже не понимаю, почему это принятый ответ
ОП попросил все ветки. Этот ответ только один.
Это именно то, что я искал, когда нашел вопрос выше. Я подозреваю, что многие люди, ищущие, как извлечь удаленную ветку, определенно не хотят сливать ветку в свою текущую рабочую копию, но им нужна локальная ветвь, идентичная удаленной.
Его поведение по умолчанию сейчас. Не было случая на старых версиях git. С помощьюgit checkout remotebranchname раньше просто создавал новыйunrelated ветвь с именемremotebranchname.
Даже если ветка не видна локально, я могу сделатьgit checkout remotebranchnameи это работает. в чем разница с вашим решением?
8

кажется, не работают для меня, и я хотел игнорировать origin / master. Вот что сработало для меня.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

После этого:

git fetch --all
git pull --all
Стилистическое улучшение, чтобы избежатьgrep | awk antipattern: git branch -r | awk -F 'origin/' '!/HEAD|master/{ ...
Вариант этого является правильным ответом, но этот не работает во всех крайних случаях. Также названия веток могут быть в стиле фанк. Поэтому я сделал следующее: git branch -r | grep -v ГОЛОВА | grep & # x2013; v master | awk -F "происхождение /"; & quot; {печать $ 2 & quot; & Quot; $ 1 & Quot; происхождение / & Quot; $ 2} & APOS; | xargs -L 1 git branch -f --track; git fetch - all; git pull - все; И ЭТО ТРЮК!
38

for цикл не работал для меня, но это было именно то, что я хотел. Все ветви моего происхождения зеркально отображались как одноименные локально.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

УвидетьМайк Дюпонкомментарий ниже. Я думаю, что пытался сделать это на сервере Jenkins, который оставляет его в режиме отсоединенной головы.

@kristianp Вы проверили Ungit или GitKraken?
@ dragon788 Я использовал SourceTree для git GUI, но я действительно говорил о более простой командной строке для задач сценариев.
Мое решение, использующее этоgit checkout --detach # detach the head а потомgit fetch origin \'+refs/heads/*:refs/heads/*
Что производитfatal: Refusing to fetch into current branch refs/heads/master of non-bare repository после простого клона. Сначала нужно отсоединить голову. Я сделал это сgit checkout <SHA>
Этот работал для меня, за исключением того, что я также использую параметр --tags. Хотелось бы, чтобы был стандартный, простой интерфейс для git, количество простых вещей в git, которым нужно более 10 ответов о переполнении стека, просто смешно!
171

отслеживающие удаленные филиалы.

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

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

После этого,git fetch --all обновит все локальные копии удаленных филиалов.

Также,git pull --all обновит ваши локальные ветви отслеживания, но в зависимости от ваших локальных коммитов и того, как «слить»; Опция configure установлена, это может создать коммит слияния, ускоренную перемотку вперед или сбой.

Это обеспечивает защиту решения от имен ветвей, содержащих метасимволы оболочки (согласно комментарию пинкеена к другому ответу), и позволяет избежать вывода ложных ошибок: git branch -r | grep -v - & apos; - & GT; & APOS; | пока читаешь пульт; do git branch --track & quot; $ {remote # origin /} & quot; & Quot; $ дистанционное & Quot; 2 & gt; & 1 | grep -v & apos; уже существует; сделанный
Вы уверены, чтоgit pull --all обновит все локальные ветки трекинга? Насколько я могу сказать, он только обновляет текущую ветку со всех пультов.
@ TomHale Это было "происхождение" но спасибо за ваш ответ - хотя сумасшедший, что много нужно сделать, что должно быть один или, может быть, два флага. Я сейчас пытаюсь бездарно, чтобы попытаться избежать безумия некоторых аспектов мерзавца.
Сделал это. Локальные ветви, соответствующие удаленным ветвям, не были созданы. Что это за команда git, которая просто говорит "вытянуть все удаленные ветви, создавая локальные ветви, если они не существуют?"
@JosephK возможно ваш пульт не называетсяorigin? Увидетьthis answer который будет работать на всех удаленных именах.
2

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

Вы можете запустить выходной файл в виде сценария оболочки, если хотите.

Мы случайно удалили наш репозиторий проекта Stash. К счастью, кто-то создал вилку прямо перед случайной потерей. Я клонировал вилку на свой местный (опущу детали того, как я это сделал). После того, как я полностью освоил вилку, я запустил одну однострочную. Я изменил URL удаленного сервера (источник в моем случае), чтобы он указывал на целевой репозиторий, в который мы восстанавливали:

git remote set-url origin <remote-url>

И, наконец, подтолкнул все ветви к происхождению так:

git push --all origin

и мы вернулись в бизнес.

9

.git/config файл.

В этом примере толькоorigin/production ветка извлекается, даже если вы пытаетесь сделатьgit fetch --all ничего не произойдет, кроме полученияproduction ветка:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

Эта строка должна быть заменена на:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

Тогда бегиgit fetch так далее...

Проверить:git config --get remote.origin.fetch а затем (разрушительно) установить его:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
или измените конфигурационный текстовый файл в каталоге .git, у меня сработало
0

ветка с именем« origin / master » уже существует. & apos; вам нужно это:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done
11

как вы клонируете главный репозиторий, вы можете просто выполнить

git fetch && git checkout <branchname>
Большое спасибо, это должен быть правильный ответ.
Это не отвечает на первоначальный вопрос: "Как бы я вытащил все ветви локально?" Он вытягивает их один за другим, что не масштабируется. Рассмотрим случай с 100 ветками.
просто. и работал, чтобы получить ветку из удаленного источника
0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

yourNewLocalBranchName твойrequiredRemoteBranch.

Похожие вопросы