Gitですべてのリモートブランチを複製する方法は?


4129

私が持っているmasterdevelopmentブランチは、両方ともにプッシュGitHubの。私はcloned、pulled 、ed をしましたfetchが、masterブランチ以外は何も戻すことができません。

私は明らかな何かを見逃していると確信していますが、私はマニュアルを読みましたが、まったく喜びがありません。


133
ここで受け入れられた回答(git branch -a)はリモートのブランチを示していますが、それらのいずれかをチェックアウトしようとすると、「デタッチされたHEAD」状態になります。次の回答(2番目に賛成)は、別の質問に答えます(つまり、すべてのブランチをプルする方法です。これは、ローカルで追跡しているブランチに対してのみ機能します)。コメントのいくつかは、git branch -aすべてのリモートブランチをローカルで追跡するシェルスクリプトで結果を解析できることを指摘しています。概要:希望どおりの操作を行うためのgitネイティブの方法はありません。いずれにしても、それほど素晴らしいアイデアとは限りません。
Day Davis Waterbury

5
フォルダー全体を古い方法でコピーするだけでしょうか?scp some_user@example.com:/home/some_user/project_folder ~わからない..けれども、そのソリューションは、githubのために動作するかどうか
snapfractalpop

19
「クローン、プル、フェッチした」と言ったのではなく、実行した正確なコマンドを示した方がはるかにわかりやすいでしょう。
ボブ・ギルモア

57
「クローン」が正確なコピーの意味ではない理由は、常に私を驚かせます。それが正確なクローンである場合、すべてのブランチがローカルリポジトリの一部である必要はありませんか?配布されるということのポイントじゃないですか?したがって、リポジトリがなくなっても、すべての完全なコピーが残っています。それとも、いわゆる「リモート」は本当にローカルリポジトリの一部ですか?
ハギー、2016

21
すべての賛成票、回答、回答に対するコメント、そして驚異的な数のビューを見ると、gitがこれを実行するためのコマンドを追加したときだと思います。そして、あなたは@huggieです。
Sнаđошƒаӽ

回答:


4557

最初に、リモートGitリポジトリのクローンを作成し、そこにcdします。

$ git clone git://example.com/myproject
$ cd myproject

次に、リポジトリのローカルブランチを確認します。

$ git branch
* master

しかし、リポジトリに隠れている他のブランチがあります!これらは-aフラグを使用して確認できます。

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

上流のブランチを簡単に確認したい場合は、直接チェックアウトできます。

$ git checkout origin/experimental

ただし、そのブランチで作業したい場合は、ローカルトラッキングブランチを作成する必要があります。

$ git checkout experimental

そしてあなたは見るでしょう

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

その最後の行には、「新しいブランチ」という人がいます。それが実際に意味することは、ブランチがインデックスから取得され、ローカルに作成されることです。以前のそれはブランチが通常の原点/ BRANCH_NAMEブランチを意味し、リモートブランチを追跡するように設定されていることがわかりますように、ラインは、実際にはより有益です

ここで、ローカルのブランチを見ると、次のようになります。

$ git branch
* experimental
  master

実際には、を使用して複数のリモートリポジトリを追跡できますgit remote

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

この時点で、物事はかなりおかしくなっているので、実行gitkして何が起こっているかを確認してください:

$ gitk --all &

119
たとえば、origin / experimentalの実験版など、リモートブランチをすべて自動的に作成するにはどうすればよいですか。
クリスティアンCiupitu 09年

54
クリスチャン:私は常にすべてのブランチ 'origin / foo'に対してブランチ 'foo'を作成していましたが、これは2つの問題を引き起こしました:(1)対応するリモートブランチの背後にある多くのコミットである本当に古い追跡ブランチがたくさんありました、および(2)古いバージョンのgitでは、 'git push'を実行すると、ブランチが古い場合でも、すべてのローカルブランチをリモートにプッシュしようとします。したがって、私は積極的に開発しているもののためにローカルブランチのみを保持し、それらについての情報が必要な場合はorigin / *ブランチに直接アクセスします。(とはいえ、シェルスクリプトを使用して 'git branch -a'を解析できます。)
emk

49
「git fetch <origin-name> <branch-name>」は、ブランチをローカルにダウンさせます。

137
良い答えですが、ちょっと質問を逃しています。私はすべてのリモートブランチをチェックアウトするためのワンライナーを探していました。
cmcginty 2010年

32
問題は、リモートブランチをチェックアウトするのではなく、すべて複製することでした。また、前述したように、ローカルトラッキングブランチを必要以上に作成したくないのは、それらが本当に古くなると頭痛の原因となる可能性があるためです。
EMK、

822

一度にフェッチしたいリモートブランチが多数ある場合は、次のようにします。

$ git pull --all

これで、リモートリポジトリにアクセスすることなく、必要に応じてブランチをチェックアウトできます。


12
git cloneを実行すると、マスターブランチがローカルに、10のブランチが「リモート」になります。したがって、Gabeによるこの回答は非常に役に立ち、質問に答えます。
basZero 2012年

38
これは局所的にしかいない追加されたリモートブランチフェッチ任意のリモートブランチ
jujule

33
最初のコマンドは冗長です。単にgit pull --all同じことを行います-二度フェッチしないだけです。そして、infosec812は、これがとにかく質問に答えないのは正しいです。これがどうして多くの賛成票を獲得したのだろう。
Sven Marnach

6
私がした後git remote update、その後、試してみましたgit branch、私は地元の支店を参照してください。しかし、そうすればgit branch -a、リモートブランチが表示され、git pull <branchname>必要なブランチを取得するためにa を実行できます。-私はGoogle検索からこの質問にたどり着きました。この答えは私の問題を解決します。
WNRosenberg 2013年

38
これはまったく役に立ちません。既存のもの以外のリモートブランチをプルしません。
Avinash R 2013

446

このBashスクリプトは私を助けてくれました:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

マスター(おそらく元のcloneコマンドから取得したもの)を除くすべてのリモートブランチのトラッキングブランチを作成します。私はあなたがまだ行う必要があるかもしれないと思います

git fetch --all
git pull --all

念のため。

1つのライナーgit branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
通常どおり:rm -rf universeをコピーする前に、セットアップでテストしてください。

ワンライナーのクレジットはユーザーcfiに送られます


19
これは本当に完璧な解決策に近いものです。それをより良くする唯一のことは、この機能がgitのオプションとして組み込まれている場合です。
Deven Phillips、2011

51
「ワンライナー」:git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs いつものように:コピーする前にセットアップでテストするrm -rf universe as we know it
cfi

4
このコマンドは、リモートから通常のブランチ(機能ブランチではない)として機能ブランチを作成します-これを修正するにはどうすればよいですか?
Alex2php 2014年

4
ブランチ名に「/」の問題が発生した場合は、gitエイリアスを使用して以下の解決策があります。「13年5月15日11:02に回答済み」の「nobody」による回答を参照
wemu

8
remotes/origin/名前空間を保持するためだけにトリミングしています:for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
kgadek

348

この--mirrorオプションを使用すると、remote追跡ブランチが適切にコピーされるようです。ただし、リポジトリはベアリポジトリとして設定されるため、後で通常のリポジトリに戻す必要があります。

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

リファレンス:Git FAQ:リモートで追跡されたすべてのブランチを含むリポジトリのクローンを作成するにはどうすればよいですか?


7
投票がないにもかかわらず、これは実際にはかなり良い答えのように思えます。その方法でそれをすることへの落とし穴はありますか?これらのコマンドを実行した後、ブランチを明示的にチェックアウトする必要がありました。
ループ

27
これをgit push --mirrorと組み合わせると、github.comからgithubエンタープライズインストールに移動するときに、リモートgitリポジトリの完全な複製を作成するために必要なものとまったく同じになります。ありがとう!
Jacob Fike 2012

3
@Dave:final git checkoutas lastコマンドを追加して、クローンリポジトリの現在のブランチのヘッドを最終的にチェックアウトします。これは素晴らしい答えです。勇気を出してください。最終的にはトップに
戻り

3
@デイブ:フム。私は考え直しています:--mirrorはすべてのブランチを追跡対象として設定するだけではありません。これは、オリジンからすべての参照をコピーし、その後、それgit remote updateを再び行います。プルの動作が変わります。完全なコピーには1行のスクリプトが必要であると信じています。
cfi 2012

5
git clone --mirrorgitリポジトリのバックアップに最適です^ _ ^
TrinitronX

220

派手な「git checkout -b somebranch origin / somebranch」構文を使用せずに、ブランチに簡単に切り替えることができます。あなたはただ行うことができます:

git checkout somebranch

Gitは自動的に正しいことを行います。

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Gitは、同じ名前のブランチが1つのリモートに存在するかどうかをチェックし、存在する場合は、リモートブランチであることを明示的に指定した場合と同じ方法で追跡します。Git 1.8.2.1のgit-checkout manページから:

<branch>が見つからないが、名前が一致する1つのリモート(<remote>と呼びます)に追跡ブランチが存在する場合は、次と同等として扱います。

$ git checkout -b <branch> --track <remote>/<branch>

1
したがって、ブランチcheckoutの名前が​​リモートブランチの名前と同じである場合、「/」の後のすべては、gitは同じ名前のブランチを作成し、「/」の後のすべては、そのリモートを「追跡」します?そして追跡によって、私たちは意味:git pushgit pullなどがそのリモートで行われるのですか?これが正しい場合は、@ Danielに同意するため、より多くの情報で回答を拡張します。この回答は、より多くの担当者に値するものです。
ジェラルドロシュ

5
@BullfrogBlues、すべての質問に対する答えは「はい」のようです(私はgit v1.7.7.4を使用しています)。私はこの行動がもっとよく知られるべきであることに同意します。(それはこのバージョンのgitのマニュアルにはありません。)私は実際にはこの動作が好きではありません。むしろエラーが発生し、git checkout --track origin/somebranch明示的に言わなければなりません。
dubiousjim

3
@dubiousjim:実際、これはマニュアルにあります。git-checkout(1)は、次のように述べています。 > --track <remote> / <branch> '"(Git V.1.8.1.1)。
sleske 2013

$ git pull * <remote> / *-ここで必要なのは "*"がワイルドカードであるため、ローカルシステムにまだないブランチを含むすべてのブランチをプルします。これを行う方法?コードをローカルシステムにプルするために、すべてのブランチをチェックアウト/プルする必要がありますか?
JosephK 2017

98

について、

$ git checkout -b実験的な起源/実験的

を使用して

$ git checkout -t origin/experimental

または、より詳細だが覚えやすい

$ git checkout --track origin/experimental

リモートリポジトリの追跡という点では、より優れている場合があります。


つまり、2番目の形式の方が覚えやすく、他に違いはないということですか。
aderchox

79

あなたがしているフェッチはすべてのリモートブランチを取得するはずですが、それらのローカルブランチは作成しません。gitkを使用している場合は、「remotes / origin / dev」または同様のリモートブランチが表示されるはずです。

リモートブランチに基づいてローカルブランチを作成するには、次のようにします。

git checkout -b dev refs / remotes / origin / dev

これは次のようなものを返すはずです:

ブランチ開発者は、リモートブランチ参照/リモート/起点/デバイスを追跡するように設定されています。
新しいブランチ「dev」に切り替えました

これで、devブランチにいるとき、「git pull」はローカルdevをリモートdevブランチと同じポイントに更新します。すべてのブランチをフェッチしますが、ツリーの一番上にあるブランチのみをプルすることに注意してください。


14
ここに参照/リモートは必要ありません。git checkout -b dev origin / devは正常に動作します。
emk '09 / 09/17

3
これは常に機能しますgit checkout -b newlocaldev --track origin/dev。ローカルブランチにリモートブランチと同じ名前を付けたい場合、リモートブランチにわかりにくい名前を付けない場合は、を省略できます-b newlocaldev。デフォルトではbranch.autosetupmergeコンフィグ設定、およびローカルブランチが名付けていないと仮定するとdev、これらの2つのコマンドは同じことを行う可能性がありますgit checkout -b dev origin/devし、単なるgit checkout dev。最後に、git checkout origin/dev新しいブランチを作成せず、デタッチされたHEAD状態にします。
dubiousjim

リモートが存在しないが、Gitが愚かすぎて削除されたことを確認できない場合はどうなりますか?これは、あなたが更新git branch -aし、リモートブランチとしてリストし続けることを前提としています。
jww 2016

そして、私たちはこれを数十のブランチに対して行いますか?
JosephK 2017

59

「git clone git:// location」を実行すると、すべてのブランチとタグが取得されます。

特定のリモートブランチの上で作業するには、それが元のリモートであると想定します。

git checkout -b branch origin/branchname

2
「すべてのブランチとタグが取得される」というメモに感謝します。私はあなたの答えが間違っているとコメントするつもりでしたが、それを確認したところ、あなたは完全に正しいとわかりました。ある意味で、あなたは最も短い答えを提供しました-あなたがクローンした場合、あなたはすでにそれを持っています。いいね。追加しようとすることができます:$ git branch -a学ぶことを試みてください、どんなリモートブランチがすでに利用可能か。
Jan Vlcinsky 2013年

私が投稿した答えも見てください。これは、多くのリモートブランチでローカルで作業する必要があり、リモートブランチを1つずつチェックアウトする必要がないことがわかっている場合に役立ちます。
lacostenycoder

git checkout -b master origin/mastergit checkout --track origin/masterpleaseの違いは何ですか?
aderchox

1
@aderchox今日、私は誰もいないと思います。
elmarco

58

エイリアスを使用します。ネイティブGitワンライナーはありませんが、独自のものを次のように定義できます。

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

そしてそれを次のように使用します

git clone-branches

ありがとう。これは、他のいくつかの回答とは異なり、実際にはすべてのリモートブランチを複製します
FearlessHyena

50

「マスター」しか表示されない理由

git cloneすべてのリモートブランチをダウンロードしますが、ファイルが新しいリポジトリにある場合でも、それらを「リモート」と見なします。これには1つの例外があります。それは、クローン作成プロセスが「master」というリモートブランチから「master」というローカルブランチを作成することです。デフォルトでgit branchは、ローカルブランチのみを表示するため、「マスター」のみが表示されます。

git branch -aリモートブランチを含むすべてのブランチを表示します。


地元の支店を取得する方法

実際にブランチで作業したい場合は、おそらくブランチの「ローカル」バージョンが必要になります。リモートブランチからローカルブランチを簡単に作成するには(チェックアウトして作業ディレクトリの内容を変更せずに)、次のようにします。

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

この例でbranchoneは、はに基づいて作成するローカルブランチの名前ですorigin/branchone。代わりに、異なる名前でローカルブランチを作成する場合は、次のようにします。

git branch localbranchname origin/branchone

ローカルブランチを作成したら、それを表示できますgit branch-aローカルブランチを表示する必要はありません)。


origin/branchone存在する場合は、を使用git checkout branchoneして同じ名前のローカルブランチを作成し、リモートトラッキングを設定することもできます。
エヴァン

47

これはそれほど複雑ではなく、非常に単純で簡単な手順は次のとおりです。

git fetch origin これにより、すべてのリモートブランチがローカルに移動します。

git branch -a これにより、すべてのリモートブランチが表示されます。

git checkout --track origin/<branch you want to checkout>

次のコマンドを使用して、目的のブランチにいるかどうかを確認します。

git branch

出力は次のようになります。

*your current branch 
some branch2
some branch3 

現在のブランチを示す*記号に注意してください。


1
スラジありがとう。あまり投票されていないからです。そして、ansは質問者に受け入れられません。
2015年

「git fetch origin」はリモートブランチをローカルに持ってきませんでした-またはそれらはどこかに隠されていますか?上記のすべての答えを読むと頭痛がしました。「git fetch all branch to local」を探しています。これを行うには、bashスクリプト以外の方法が必要です。
JosephK 2016年

1
"git fetch origin"を実行すると、ターミナルに次のような出力が表示されます-"* [new branch] branch_name-> origin / branch_name" "git branch"を実行すると、ローカルのみが表示されます代わりにブランチを使用して、すべてのブランチを表示するには、「git branch -a」を実行してから、リモートブランチに切り替えるには、「git checkout --track origin / <チェックアウトするブランチ>」を実行する必要があります。お役に立てれば。:-)
サム

4
質問は、「すべてのリモートブランチのクローンを作成する」方法でした。つまり、一度に1つずつ手動で更新する方法ではありませんでした。実際の質問への答えはないようです-ブランチがたくさんある場合、タイピング全体を行う方法だけです。
JosephK

47

遅れることはありませんが、これが最善の方法です。

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

この時点で、すべてのブランチを含むリモートリポジトリの完全なコピーがあります(で確認git branch)。リモートリポジトリに独自のリモート--mirrorがある--bare場合は、代わりに使用できます。


ここでの編集中に問題が発生しました。今、この答えは意味がありません。--bare最後の文で言及された「」は、指定されたコマンドリストに存在しません。
セラン

以下のDaveの回答を参考にしてください。'git config unset core.bare'の代わりに 'git config --bool core.bare false'を使用するとうまくいきます。
混乱しているVorlon 2014年

私は持っていerror: key does not contain a section: unsetます。Daveの答えは良い作品。
olibre

それはgit config --unset core.bare実際に...私にとって、これはここの回答で提示されたすべての中で最もクリーンな解決策のようです。それは非常に少ないupvotesを持って残念...
ダークHillbrecht

1
@ChrisSimに感謝しgit config --bool core.bare falseます。これが、代わりにDaveの回答をお勧めする理由です。デイブの答えについてどう思いますか?乾杯
olibre

39

これを行うだけです:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

「git clone git://example.com/myprojectt」はブランチも含めてすべてをフェッチします。ブランチをチェックアウトするだけで、ローカルブランチが作成されます。


25

すべてのブランチを取得するには、「git clone」を使用するだけです。

git clone <your_http_url>

マスターブランチしか表示されていませんが、「git branch -a」を使用してすべてのブランチを表示できます。

git branch -a

そして、あなたはすでに持っているどんなブランチにも切り替えることができます。

git checkout <your_branch_name>

「git clone」した後は、リモートリポジトリに接続する必要がなく、wifiを閉じたときに「git branch -a」と「git checkout」を正常に実行できることを心配しないでください。したがって、「git clone」を実行すると、リモートリポジトリからすべてのブランチがすでにコピーされていることが証明されます。その後は、リモートリポジトリは必要ありません。ローカルにはすでにすべてのブランチのコードがあります。


ここで非常に明確な応答。このトピックについて混乱している多くの人々。
XMAN、2018年

「wifiを閉じたときに正常に実行できる」というステートメントを2番目に述べたいと思います。「git clone」を実行すると、実際にはすべてのブランチを含むリポジトリが作成されます。
bvgheluwe

非常に明確でわかりやすい答え。
Amr

24

A git cloneはリポジトリ全体をコピーすることになっています。クローンを作成してから、を実行してくださいgit branch -a。すべてのブランチがリストされているはずです。次に、「master」ではなくブランチ「foo」に切り替える場合は、を使用しますgit checkout foo


1
ハイフンの有無にかかわらず、gitコマンドを実行できます。「git-branch」と「git branch」の両方が機能します。
Peter Boughton、

21
たぶんこの答えはgitの動作が変わった昔のことですが、今日は誤解を招くと思います。git cloneすべてのリモートブランチをダウンロードしますが、マスターのローカルブランチのみを作成します。git branchローカルブランチしか表示されないため、git branch -aリモートブランチも表示する必要があります。
セラン2014年

ありがとうございました。これは、一種の奇妙なデフォルト動作IMOです。私はそれをより不可解なギットネスにまでチョークで書きます。ブランチをダウンロードした場合、gitブランチを呼び出すときになぜブランチを非表示にするのですか?
Adam Hughes

1
@Cerran、ありがとう。私はそれに応じて私の答えを更新しました。
MattoxBeckman

「すべてのリモートブランチをダウンロードしますが、マスターのローカルブランチしか作成しません」。これを理解する手助けが必要です。git cloneはmaster以外のブランチを複製しないようです。「git branch -a」を実行すると、「develop」ブランチが「remotes / origin / develop」にのみあることが示されるためです。これはあなたがこのブランチをローカルにどこにも持っていないことを言っているに違いありません、それは現在オリジンにのみ存在していますよね?
John Little

19

私のツールgit_remote_branchを使用してくださいください(マシンにRubyがインストールされている必要があります)。これは特に、リモートブランチの操作を非常に簡単にするために作成されています。

ユーザーに代わって操作を実行するたびに、コンソールに赤で印刷されます。やがて、彼らはついにあなたの脳に入り込みます:-)

grbに代わってコマンドを実行させたくない場合は、 'explain'機能を使用してください。コマンドは、実行される代わりにコンソールに出力されます。

最後に、覚えやすいように、すべてのコマンドにはエイリアスがあります。

これはアルファ版ソフトウェアであることに注意してください;-)

grb helpを実行したときのヘルプは次のとおりです。

git_remote_branchバージョン0.2.6

  使用法:

  grb create branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb rename branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  ノート:
  -origin_serverが指定されていない場合、「origin」という名前が想定されます 
    (gitのデフォルト)
  -名前変更機能は現在のブランチの名前を変更します

  Explainメタコマンド:コマンドの前に 
キーワード「説明」。コマンドを実行する代わりに、git_remote_branch
単に実行する必要があるコマンドのリストを出力します 
その目標。

  例: 
    grb説明作成
    grb説明create my_branch github

  すべてのコマンドにはエイリアスもあります:
  作成:作成、新規
  削除:削除、破棄、削除、削除、rm
  公開:公開、リモート化
  rename:名前の変更、rn、mv、移動
  追跡:追跡、追跡、取得、フェッチ

6
賢明な言葉:このプロジェクトは、この回答が投稿された頃に放棄されたようです。2008年以降、アップデートは見つかりません。私が間違っている場合は、誰かが現在のポインタを編集して提供してくれるといいのですが、このような便利なツールが欲しいです。
bradheintz、2011

:@bradheintzこの答えをチェックし、それはgitのエイリアス設定stackoverflow.com/a/16563327/151841
user151841

19

ここで私が見た答えはすべて有効ですが、リポジトリを複製してすべてのブランチを一度にプルする方法はもっとすっきりしています。

リポジトリを複製すると、ブランチのすべての情報が実際にダウンロードされますが、ブランチは非表示になります。コマンドで

$ git branch -a

リポジトリのすべてのブランチを表示することができ、コマンドで

$ git checkout -b branchname origin/branchname

その後、手動で一度に1つずつ「ダウンロード」できます。


ただし、多くのブランチを持つレポを複製する場合、上記のすべての方法は長くて面倒ですが、少し複雑ですが、これから説明する方法は非常に簡潔で迅速です。これを行うには、3つの手順が必要です。

  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」コマンドで確認できます。

  1. 第二段階

git構成のブール値「bare」をfalseに切り替えることにより、このリポジトリを空の(ベア)リポジトリから通常のリポジトリに切り替えます。

$ git config --bool core.bare false
  1. 第三段階

現在のフォルダー内にあるすべてのものを取得し、ローカルマシン上にすべてのブランチを作成するため、これは通常のリポジトリになります。

$ git reset --hard

これで、コマンド「git branch」を入力するだけで、すべてのブランチがダウンロードされたことがわかります。

これは、すべてのブランチを含むgitリポジトリを一度に複製する簡単な方法ですが、この方法ですべてのプロジェクトに実行したいものではありません。


「ダウンロード」という単語を... を1つずつ手動で「ダウンロード」するのは好きではありません。実際、すべての情報は、リポジトリのクローンを作成した後ですでにダウンロードされています。必要なのは、ローカルの追跡ブランチを作成することだけです(これはオフラインのときにも可能で、すべての情報がリポジトリにあることが証明されます)。
bvgheluwe

@bvgheluweそれが引用符で囲まれている理由です。
FedericoCapaldo

15

ローカルリポジトリからのクローンは、git cloneとgit fetchでは機能しません。多くのブランチ/タグがフェッチされないままになります。

すべてのブランチとタグを持つクローンを取得します。

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

すべてのブランチとタグだけでなく作業コピーも含むクローンを取得するには:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

13

OK、リポジトリを複製すると、そこにすべてのブランチがあります...

あなただけの場合 git branch、それらは一種の隠されたものです...

したがって、すべてのブランチ名を表示したい場合は、単に追加します --allフラグを。

git branch --all または git branch -a

ブランチにチェックアウトするだけで、必要なものがすべて手に入ります。

しかし、クローンした後に他の誰かがブランチを作成した場合はどうでしょうか?

この場合は、次のようにします。

git fetch

そして、すべてのブランチをもう一度確認します...

フェッチとチェックアウトを同時に行う場合は、次のようにします。

git fetch && git checkout your_branch_name

また、私が言ったことを簡単にするために、以下の画像を作成しました。

git branch --allすべてのブランチを取得する


3
「持っている」と「見える」には違いがあります。git branch -allは、リモートリポジトリを削除しても、リモートブランチを一覧表示しなくなります。
ギュスターヴ

12

質問の答えの1つを見ると、短くすることが可能であることに気付きました。

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

ただし、リモートブランチの1つにadmin_masterなどの名前が付けられている場合は、ダウンロードされません。

オリジナルのアイデアを提供してくれたbigfishに感謝


正規表現を改善するかgrep、の代わりにAwkを使用して、フィルターを改善し、誤検知を回避できます。
tripleee 2015年

すべてのブランチは 'origin \ my_branch_name'ですが、これは間違いなく私が望むものではありません。
Sнаđошƒаӽ

私は以前に$ {branch ## * /}構成を見たことはありません-本当に便利そうです-それについてもっと知ることができるアイデアはありますか?どこでもbashの下で見つけることができないようです。THX。
SaminOz


10

コマンドラインにコピーして貼り付けるには:

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. マスターとヘッドを除くリモートのすべてのブランチループします
    1. ローカルブランチを削除します(強制的に更新されたブランチをチェックアウトできるようにするため)
    2. リモートからブランチをチェックアウトする
  4. マスターをチェックアウトします(そのため)

基づいた答えVonC


10

オリジンリモートにあるすべてのgitブランチをチェックアウトできるように、この小さなPowershell関数を作成しました。

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設定リポジトリにあります


9

これがawkを使った答えです。新しいリポジトリで使用する場合、このメソッドで十分です。

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

既存のブランチは単にチェックアウトされるか、すでにブランチとして宣言されますが、競合を回避するためにフィルターを追加できます。

また、明示的なgit checkout -b <branch> -t <remote>/<branch>コマンドを呼び出すように変更することもできます。

この回答は、ニコスC.考えに従います。


あるいは、代わりにリモートブランチを指定できます。これはマーフィートーク答えに基づいています

git branch -r | awk '{ system("git checkout -t " $NF) }'

衝突時に致命的なエラーメッセージをスローしますが、無害だと思います。


両方のコマンドにエイリアスを設定できます。

nobody回答を参照として使用して、次のコマンドでエイリアスを作成できます。

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

個人的に私は使用したいですtrack-alltrack-all-branches


感謝したかっただけです。これは完全に働いたと、それはなどを変更し、いくつかのプル動作と裸のレポをクローニングに関連する様々な問題を抱えていません
mahonya

8

私はまったく同じことをする必要がありました。これが私の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]

このスクリプトをまったく実行する必要がないように、私がさらに投稿した回答を参照してください。
lacostenycoder

8

ユーザーの誰もが正しい方向に進んでいない限り、これらの答えはどれもそれを切りません。

あるサーバー/システムから別のサーバー/システムにリポジトリを移動するときに問題が発生しました。リポジトリのクローンを作成すると、マスターのローカルブランチしか作成されなかったため、新しいリモートにプッシュすると、マスターブランチのみがプッシュされました。

だから私はこれらの2つの方法が非常に便利だと思いました。彼らが他の誰かを助けることを願っています。

方法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

8

git clone --mirror 元のレポでこれはうまくいきます。

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin

7

通常、Gitは(指定されていない場合)git ls-refs、履歴を完了するために必要なオブジェクトとともに、1つ以上の他のリポジトリからすべてのブランチまたはタグ(参照、参照:)をフェッチします。言い換えれば、すでにダウンロードされているオブジェクトから到達可能なオブジェクトをフェッチします。参照:何をするん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

トラブルシューティング

それでもmasterブランチ以外を取得できない場合は、以下を確認してください。

  • リモコン(git remote -v)を再 確認してください。
    • それを検証しgit config branch.master.remoteますorigin
    • originが正しいURLを指しているかどうかを確認しますgit remote show origin(この投稿を参照)。

7

2017年の初めに、このコメントの答え機能します:

git fetch <origin-name> <branch-name>あなたのために枝を倒します。これはすべてのブランチを一度にプルするわけではありませんが、ブランチごとに単独で実行できます。


これには、各ブランチを一度に1つずつフェッチする必要があります。ブランチがたくさんある場合は、あまり良くありません。
lacostenycoder

6

次に、すべてのリモートブランチのローカルブランチを作成する別の短い1行のコマンドを示します。

(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.