Как клонировать все удаленные ветки в Git? - PullRequest
3841 голосов
/ 16 сентября 2008

У меня есть ветвь master и development, оба сдвинуты до GitHub . У меня есть clone d, pull ed и fetch ed, но я не могу получить ничего, кроме master ответвления.

Я уверен, что упускаю что-то очевидное, но я прочитал руководство и совсем не радуюсь.

Ответы [ 35 ]

11 голосов
/ 11 декабря 2016
#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

Этот код перетянет код всех удаленных веток в локальное хранилище.

10 голосов
/ 20 декабря 2013

Для копирования-вставки в командную строку:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

Для большей читабельности:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


Это будет:
  1. проверить мастер (чтобы мы могли удалить ветку, в которой мы находимся)
  2. выберите пульт , чтобы оформить заказ (замените его на любой другой пульт)
  3. цикл через все ветви пульта, кроме главного и HEAD
    1. удалить локальная ветвь (чтобы мы могли проверить принудительно обновленные ветки)
    2. проверить ветку с пульта
  4. проверить мастера (ради этого)

На основании ответа из VonC .

8 голосов
/ 11 декабря 2010

Мне нужно было сделать то же самое. Вот мой Ruby скрипт.

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]
8 голосов
/ 19 июня 2016

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

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

Больше функций git можно найти на в моем репозитории настроек git

7 голосов
/ 31 марта 2016

Git обычно (если не указан) извлекает все ветки и / или теги (см. git ls-refs) из одного или нескольких других хранилищ вместе с объектами, необходимыми для завершения их истории. Другими словами, он выбирает объекты, которые доступны объектам, которые уже загружены. Смотрите: Что на самом деле делает git fetch

Иногда у вас могут быть ветки / теги, которые не связаны напрямую с текущим, поэтому git pull --all / git fetch --all не поможет в этом случае, но вы можете перечислить их по:

git ls-remote -h -t origin

и получить их вручную, зная имена ссылок.

Чтобы получить их все , попробуйте:

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

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

Затем снова проверьте все свои филиалы:

git branch -avv

Если приведенное выше не поможет, вам нужно вручную добавить недостающие ветви в отслеживаемый список (так как они каким-то образом потерялись):

$ git remote -v show origin
...
  Remote branches:
    master      tracked

по git remote set-branches как:

git remote set-branches --add origin missing_branch

, поэтому он может появиться под remotes/origin после извлечения:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

Устранение неполадок

Если вы все еще не можете получить ничего, кроме основной ветки, проверьте следующее:

  • Дважды проверьте пульты (git remote -v), например,
    • Подтвердите, что git config branch.master.remote равно origin.
    • Проверьте, указывает ли origin правильный URL-адрес с помощью: git remote show origin (см. сообщение ).
6 голосов
/ 21 апреля 2017

По состоянию на начало 2017 года, ответ в этом комментарии работает:

git fetch <origin-name> <branch-name> приносит ветку для вас. Хотя это не вытягивает все ветви одновременно, вы можете выполнять эту ветвь по отдельности.

6 голосов
/ 11 марта 2016

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

Я использую Bitbucket, службу хостинга репозитория Atlassian. Поэтому я стараюсь следовать их документам. И это прекрасно работает для меня. С помощью следующих простых и коротких команд вы можете оформить удаленную ветку.

Сначала клонируйте свой репозиторий, затем перейдите в папку назначения. И последнее, но не менее важное: выборка и проверка:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

Вот и все. Вот немного более реальный пример:

git clone https://username@bitbucket.org/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

Подробную информацию о командах вы найдете в документации: Команда клонирования , Команда извлечения , Команда извлечения

6 голосов
/ 23 января 2015

Ни один из этих ответов не исключен, кроме того, что никто не находится на правильном пути.

У меня были проблемы с переносом репо с одного сервера / системы на другой. Когда я клонировал репозиторий, он только создавал локальную ветвь для мастера, поэтому, когда я отправлял на новый удаленный сервер, была нажата только основная ветвь.

Так что я нашел эти два метода ОЧЕНЬ полезными. Надеюсь, они помогут кому-то еще.

Метод 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

Метод 2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo
5 голосов
/ 25 мая 2018

git clone --mirror на оригинальном репо хорошо подходит для этого.

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
5 голосов
/ 10 сентября 2015

Вот еще одна короткая однострочная команда, которая создает локальные филиалы для всех удаленных филиалов:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

Работает также правильно, если отслеживание локальных филиалов уже создано. Вы можете позвонить после первого git clone или в любое время позже.

Если вам не нужно извлекать ветку master после клонирования, используйте

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout
...