Как получить все ветви Git

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

$ git branch
* master

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

$ git branch
* master
* staging
* etc...

22 ответов


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

git fetch --all

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

  1. fetch не будет обновление местные отделения (в котором трек удаленные ветви); если вы хотите обновить свои локальные ветви, вам все равно нужно вытащить каждую ветку.

  2. fetch не будет создать местные отделения (в котором трек удаленные филиалы), вы должны сделать это вручную. Если вы хотите перечислить все удаленные ветви: git branch -a

до обновление локальные ветви, которые отслеживают удаленные ветви:

git pull --all

однако этого может быть недостаточно. Он будет работать только для ваших локальных филиалов, которые отслеживают удаленные филиалы. Чтобы отслеживать все удаленные ветви, выполните этот oneliner до 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 (по крайней мере) человека полезный.

мне пришлось использовать:

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

потому что ваш код создал локальные ветви с именем origin/branchname и Я получал "refname' origin / branchname ' неоднозначно, когда я ссылаться на него.


список удаленных филиалов:
git branch -r

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


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

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

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

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

и git pull --all обновит ваши локальные ветви отслеживания, но в зависимости от ваших локальных коммитов и того, как установлен параметр "слияние", он может создать слияние фиксация, перемотка вперед или сбой.


если вы:

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

$ git remote update
$ git pull --all

предполагается, что отслеживаются все ветви.

если они не вы можете стрелять в Bash:

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

затем выполните команду.


использовать git fetch && git checkout RemoteBranchName.

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


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

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

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


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

$ git branch -a

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

$ git checkout -b branchname origin/branchname

затем вы можете "загрузить" их вручную по одному за раз.


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

  1. первый шаг

    создайте новую пустую папку на вашем компьютере и клон зеркальная копия .папка git из репозитория:

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

    локальный репозиторий внутри папки my_repo_folder по-прежнему пуст, есть только скрытый .папка git теперь, когда вы можете видеть с помощью команды "ls-alt" из терминала.

  2. второй шаг

    переключите этот репозиторий из пустого (голого) репозитория в регулярный репозиторий, переключив логическое значение "голое" конфигураций git на false:

    $ git config --bool core.bare false
    
  3. Третий Шаг

    возьмите все, что внутри текущей папки и создайте все ветви на локальном компьютере, поэтому сделайте это обычным РЕПО.

    $ git reset --hard
    

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

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


обычно я использую только такие команды:

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

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

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

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

git fetch --all

или:

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

на --depth=10000 параметр может помочь, если вы уменьшили репозиторий.


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

git pull --all

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

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

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

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

Читайте также:


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

git push --all

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


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


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

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print  " " "origin/"}' | 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>

Я считаю, что вы клонировали репозиторий

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

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

git fetch && git checkout <branchname>

убедитесь, что все удаленные ветви fetchable в .

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

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

эту строку следует заменить на:

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

затем запустите git fetch etc...


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

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

после этого:

git fetch --all
git pull --all

только эти 3 команды получат все ветви

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

git config --bool core.bare false         

git reset --hard                  

Я написал небольшой скрипт для управления клонированием нового РЕПО и создания локальных ветвей для всех удаленных ветвей.

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

#!/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 "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\.//') > /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 (для меня это C:\Program Files (x86)\Git\bin\git-cloneall), затем в командной строке:

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

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


для пользователей Windows, использующих PowerShell:

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

мы можем поместить все имена ветвей или тегов во временный файл, а затем сделать 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

вот что я считаю надежным:

  • не обновляет удаленное отслеживание для существующих филиалов
  • не пытается обновить HEAD на трассе origin/HEAD
  • позволяет пульты с именем, отличным от origin
  • правильно shell цитируется
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 to git pull передает эту опцию на внутренний fetch.

кредит этот ответ.


основываясь на ответе Learath2, вот что я сделал после того, как сделал git clone [...] и cd - ing в созданный каталог:

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

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


git remote add origin https://yourBitbucketLink

git fetch origin

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

Теперь локально ваш yourNewLocalBranchName ваш requiredRemoteBranch.