Как получить все ветки Git
Я клонировал Git-репозиторий, который содержит около пяти веток. Однако, когда я делаю git branch
я вижу только одну из них:
$ git branch
* master
Я знаю, что могу сделать git branch -a
чтобы увидеть все ветки, но как бы я вытянул все ветки локально, чтобы при выполнении git branch
это показывало следующее?
$ git branch
* master
* staging
* etc...
Ответы
Ответ 1
Вы можете получить все ветки со всех пультов, как это:
git fetch --all
Это в основном силовой ход.
fetch
обновляет локальные копии удаленных веток, так что это всегда безопасно для ваших локальных веток, НО:
-
fetch
не будет обновлять локальные ветки (которые отслеживают удаленные ветки); если вы хотите обновить свои локальные ветки, вам все равно нужно тянуть каждую ветку.
-
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 версия
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
(Кажется, что pull извлекает все ветки со всех пультов, но я всегда выбираю сначала, чтобы быть уверенным.)
Выполните первую команду, только если на сервере есть удаленные ветки, которые не отслеживаются вашими локальными веткими.
PS AFAIK git fetch --all
и git remote update
эквивалентны.
Комментарий Камиля Шота, который люди сочли полезным.
Я должен был использовать:
for remote in 'git branch -r'; do git branch --track ${remote#origin/} $remote; done
потому что ваш код создал локальные ветки с именем origin/branchname
и я получал "refname 'origin/branchname" неоднозначно всякий раз, когда я ссылался на него.
Ответ 2
Список удаленных веток:
git branch -r
Вы можете проверить их как локальные ветки с помощью:
git checkout -b LocalName origin/remotebranchname
Ответ 3
Вам нужно будет создавать локальные ветки, отслеживающие удаленные ветки.
Предполагая, что у вас есть только один удаленный узел с именем origin
, этот фрагмент создаст локальные ветки для всех удаленных отслеживающих:
for b in 'git branch -r | grep -v -- '->''; do git branch --track ${b##origin/} $b; done
После этого git fetch --all
обновит все локальные копии удаленных веток.
Кроме того, git pull --all
обновит ваши локальные ветки отслеживания, но в зависимости от ваших локальных коммитов и от того, как настроен параметр конфигурации 'merge', он может создать коммит слияния, ускоренную перемотку вперед или сбой.
Ответ 4
Если вы выполните:
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
Ответ 5
$ git remote update
$ git pull --all
Это предполагает, что все ветки отслеживаются.
Если это не так, вы можете запустить это в Bash:
for remote in 'git branch -r '; do git branch --track $remote; done
Затем запустите команду.
Ответ 6
Цикл Bash for
не работал для меня, но он сделал именно то, что я хотел. Все ветки моего происхождения зеркально отображались как одноименные локально.
git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'
Смотрите комментарий Майка Дюпона ниже. Я думаю, что пытался сделать это на сервере Jenkins, который оставляет его в режиме отсоединенной головы.
Ответ 7
Используйте git fetch && git checkout RemoteBranchName
.
Это работает очень хорошо для меня...
Ответ 8
Когда вы клонируете репозиторий, вся информация о ветвях фактически загружается, но ветки скрыты. С помощью команды
$ git branch -a
вы можете показать все ветки репозитория и с помощью команды
$ git checkout -b branchname origin/branchname
вы можете "загрузить" их вручную по одному.
Однако, есть намного более чистый и быстрый способ, хотя это немного сложнее. Для этого вам нужно выполнить три шага:
-
Первый шаг
создать новую пустую папку на вашем компьютере и клонировать зеркальную копию .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" с терминала.
-
Второй шаг
переключите этот репозиторий из пустого (голого) репозитория в обычный репозиторий, переключив логическое значение "голый" из конфигураций git на false:
$ git config --bool core.bare false
-
Третий шаг
Захватите все, что находится внутри текущей папки, и создайте все ветки на локальной машине, что делает это обычным репо.
$ git reset --hard
Итак, теперь вы можете просто ввести команду git branch
, и вы увидите, что все ветки загружены.
Это быстрый способ, с помощью которого вы можете клонировать репозиторий git со всеми ветвями одновременно, но это не то, что вы хотите сделать для каждого отдельного проекта таким образом.
Ответ 9
Вы можете получить все ветки:
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.
Ответ 10
Я обычно использую ничего, кроме команд вроде этого:
git fetch origin
git checkout --track origin/remote-branch
Немного короче:
git fetch origin
git checkout -t origin/remote-branch
Ответ 11
Я полагаю, что вы клонировали хранилище:
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
Ответ 12
Если вы ищете решение, чтобы получить все ветки и затем перенести все на другой 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>
Ответ 13
После клонирования основного репозитория вы можете выполнить
git fetch && git checkout <branchname>
Ответ 14
Цикл, похоже, не работал у меня, и я хотел проигнорировать происхождение/мастер.
Вот что сработало для меня.
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
Ответ 15
Убедитесь, что все удаленные ветки выбраны в файле .git/config
.
В этом примере ветвь 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
и т.д.
Ответ 16
Именно эти три команды получат все ветки:
git clone --mirror repo.git .git (gets just .git - bare repository)
git config --bool core.bare false
git reset --hard
Ответ 17
Я написал немного script для управления клонированием нового репо и создания локальных ветвей для всех удаленных ветвей.
Вы можете найти последнюю версию здесь:
#!/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 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 (для меня, thats C:\Program Files (x86)\Git\bin\git-cloneall
), затем в командной строке:
git cloneall [standard-clone-options] <url>
Он клонирует, как обычно, но создает локальные ветки отслеживания для всех удаленных ветвей.
Ответ 18
Вот что я считаю надежным:
- Не обновляет удаленное отслеживание для существующих веток
- Не пытается обновить
HEAD
для отслеживания origin/HEAD
- Позволяет удаленным именам, отличным от
origin
- Правильно оформленная оболочка
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
.
Отдайте этому ответу.
Ответ 19
Как получить все отслеживания веток Git Single Remote.
Это было проверено и работает в Red Hat и Git Bash в Windows 10.
TL;DR:
for branch in 'git branch -r|grep -v ' -> '|cut -d"/" -f2'; do git checkout $branch; git fetch; done;
Объяснение:
Один лайнер проверяет и затем выбирает все ветки, кроме HEAD.
Перечислите ветки удаленного слежения.
git branch -r
Игнорировать ГОЛОВУ.
grep -v ' -> '
Снимите название ветки с пульта (ов).
cut -d"/" -f2
Оформить заказ на все ветки, отслеживая один пульт.
git checkout $branch
Выбрать для проверенной ветки.
git fetch
Технически выборка не нужна для новых локальных веток.
Это может быть использовано для fetch
или pull
веток, которые являются как новыми, так и с изменениями в удаленном (ых).
Просто убедитесь, что вы тянете, только если вы готовы к слиянию.
Испытательная установка
Проверьте хранилище с SSH URL.
git clone [email protected]
До
Проверьте ветки в местном.
$ git branch
* master
Выполнить команды
Выполните один лайнер.
for branch in 'git branch -r|grep -v ' -> '|cut -d"/" -f2'; do git checkout $branch; git fetch; done;
После
Проверьте, что локальные ветки включают удаленные ветки.
$ git branch
cicd
master
* preprod
Ответ 20
Для пользователей 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
Ответ 21
Вот Perl-версия однострочника, приведенная в принятом ответе:
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
и мы вернулись в бизнес.
Ответ 22
Мы можем поместить все имена ветвей или тегов во временный файл, затем 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
Ответ 23
Если у вас есть проблемы с fetch --all
отследите удаленную ветку:
git checkout --track origin/%branchname%
Ответ 24
Чтобы избежать сообщения об ошибке 'fatal: ветвь с именем' origin/master 'уже существует.', Вам нужно это:
git branch -r | grep -v '\->' | grep -v 'git branch | awk '/\*/ { print $2; }''| while read remote; do git branch --track "${remote#origin/}" "$remote"; done
Ответ 25
Основываясь на ответе Learath2, вот что я сделал после выполнения git clone [...]
и cd
-включении в созданный каталог:
git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b
Работал для меня, но я не могу знать, что это сработает для вас. Будьте осторожны.
Ответ 26
git remote add origin https://yourBitbucketLink
git fetch origin
git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)
Теперь локально ваш yourNewLocalBranchName
является вашим requiredRemoteBranch
.
Ответ 27
git fetch --all
Это позволит получить все ветки для вас, а затем вы можете проверить свою желаемую ветку через
get checkout YOUR_BRANCH
Надеюсь, что это поможет.
Ответ 28
Для пользователей Visual Studio: на консоли диспетчера пакетов:
мерзавец ветка | % {git fetch upstream; git merge upstream/master} git merge upstream/master}
Ответ 29
Это прекрасно работает:
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
Ответ 30
Перепробовал много способов, только этот прост и работает для меня.
for branch in $(git ls-remote -h [email protected]<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
git checkout "$branch"
git pull
done