すべてのリモートgitブランチをローカルブランチとして追跡する


175

単一のリモートブランチをローカルブランチとして追跡することは簡単です。

$ git checkout --track -b ${branch_name} origin/${branch_name}

すべてのローカルブランチをリモートにプッシュし、必要に応じて新しいリモートブランチを作成することも簡単です。

$ git push --all origin

逆にしたい。単一のソースにX個のリモートブランチがある場合:

$ git branch -r 
branch1
branch2
branch3
.
.
.

手動で各ブランチを作成する必要なく、それらすべてのリモートブランチのローカルトラッキングブランチを作成できますか?次のように言います:

$ git checkout --track -b --all origin

私はグーグルとRTMを使用しましたが、これまでに2段になってきました。


3
ローカルブランチのような単一のリモートブランチを追跡するためにも、簡単な方法があります:git checkout --track origin/branchname
Cerran

これは正確にはあなたが要求したものではありませんが、私にとってはうまくいきます:gitの補完を取得します:github.com/git/git/blob/master/contrib/completion/…。次に、を入力git pull origin してヒットしtab、リモートブランチのリストを取得します。次に、入力を続けてを押しますreturn
Max Heiber 2016年

回答:


111

bashの使用:

git 1.9.1以降
for i in `git branch -a | grep remote | grep -v HEAD | grep -v master`; do git branch --track ${i#remotes/origin/} $i; done

クレジット: Val Blant、elias、Hugo

git 1.9.1より前

注:次のコードを新しいバージョンのgit(> v1.9.1)で使用すると、

  1. (バグ)マスターを追跡するために作成されたすべてのブランチ
  2. (煩わしさ)接頭辞が付けられるすべての作成されたローカルブランチ名 origin/
for remote in `git branch -r `; do git branch --track $remote; done

ローカルトラッキングブランチに変更がないと仮定して、ブランチを更新します。

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

あいまいなrefname警告を無視してください。gitはローカルブランチを優先するようです。


2
refnameの警告についてヘッドアップしていただきありがとうございます。それは役に立ちました。
ポール

1
Ottoに感謝します。スクリプト作成が唯一の解決策だと思いました。かなりシンプルなものを提供しました。
Janson

1
@ジェイソン、それは今日でも唯一の解決策をスクリプト化していますか?
cregox

1
@Cawas:追跡ブランチを手動で作成する必要がありますが、追跡されたすべてのブランチをフェッチ+マージgit pullする--allスイッチがあります。
naught101 2012

13
これはGit 1.9.1では機能しませんでした。"git branch --track <banch_name>"は、目的のリモートブランチではなく、ローカルブランチマスターを追跡する新しいブランチ<branch_name>を作成します。したがって、このスクリプトは、すべてローカルマスターを指す一連のローカルブランチを作成しました。以下に解決策を掲載します。
Val Blant 2014年

183

Ottoの答えは良いですが、作成されたすべてのブランチには、名前の先頭に「origin /」が付いています。最後の部分(最後の/の後)を結果のブランチ名にしたい場合は、次のようにします。

for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done

また、あいまいな参照について警告を出さないという利点もあります。


Gitはローカルの追跡ブランチ名に「origin」を追加しません。
Adam Dymitruk、2010

14
@adymitruk:実際には、git 1.7.2.2(このコメント時点での最新の安定版)を使用して、OSX 10.6.4で私が言ったとおりに動作します。Ottoはあいまいなrefname警告にも言及しています-「origin /」が各ローカルブランチ名の一部でなかった場合、警告は存在する必要はありませんでした。Ottoのコマンドを実行した後の「gitブランチ」の出力は次のとおりです:[マスター、オリジン/ HEAD、オリジン/チャート、オリジン/マスター、オリジン/プロダクション、オリジン/ステージング]。そして私のコマンド:[チャート、マスター、プロダクション、ステージング]。
tjmcewan 2010

1
+編集:理由を説明するarticle.gmane.org/gmane.comp.version-control.git/112575を見つけました。
フィリップオークリー2011

8
私は同意します-これは、現在「受け入れられている」回答よりも優れた解決策です。
tobias.mcnulty 2012

2
代わりにgrep -v master、いかがgrep -v /HEADですか?これは、カスタマイズを必要とせずにデフォルトのブランチを除外するようです
dashrb

22

ここでの答えのほとんどは、の出力の解析を複雑にしていますgit branch -r。次のforループを使用して、リモートのすべてのブランチに対して追跡ブランチを作成できます。

これらのリモートブランチがあるとしましょう。

$ git branch -r
  origin/HEAD -> origin/master
  origin/development
  origin/integration
  origin/master
  origin/production
  origin/staging

ローカルでマスター以外を追跡していないことを確認します。

$ git branch -l    # or using just git branch
* master

この1つのライナーを使用して、追跡ブランチを作成できます。

$ for i in $(git branch -r | grep -vE "HEAD|master"); do 
    git branch --track ${i#*/} $i; done
Branch development set up to track remote branch development from origin.
Branch integration set up to track remote branch integration from origin.
Branch production set up to track remote branch production from origin.
Branch staging set up to track remote branch staging from origin.

今確認してください:

$ git branch
  development
  integration
* master
  production
  staging

それらを削除するには:

$ git br -D production development integration staging 
Deleted branch production (was xxxxx).
Deleted branch development (was xxxxx).
Deleted branch integration (was xxxxx).
Deleted branch staging (was xxxxx).

-vvスイッチを使用すると、git branch次のことを確認できます。

$ git br -vv
  development xxxxx [origin/development] commit log msg ....
  integration xxxxx [origin/integration] commit log msg ....
* master      xxxxx [origin/master] commit log msg ....
  production  xxxxx [origin/production] commit log msg ....
  staging     xxxxx [origin/staging] commit log msg ....

forループの内訳

ループは基本的にコマンドを呼び出し、git branch -rを使用して出力内のすべてのHEADまたはマスターブランチを除外しgrep -vE "HEAD|master"ます。ブランチのみからorigin/サブストリングを除いた名前を取得するには、Bashのストリング操作を使用します${var#stringtoremove}。これにより、変数「stringtoremove」が変数から削除されます$var。この例ではorigin/、変数から文字列を削除しています$i

注:または、これを行うために使用git checkout --track ...することもできます。

$ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do 
    git checkout --track $i; done

ただし、チェックアウトを実行するときにブランチ間を切り替えるため、この方法は特に気にしません。完了すると、最後に作成したブランチがそのまま残ります。

参考文献


1
gitバージョン2.3.2(Apple Git-55)と完全に
連携

22

2020年第1四半期の更新:Mohsen Abasiは、2014年のslm回答に基づいて、より簡単な代替案をコメントで提案しています

for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); 

また$()、廃止されたバックティックの代わりに使用します

別の古い答えで述べたように、使用する方git for-each-refおそらく高速です。
そして、私は新しい(Git 2.23+)git switchコマンドを使用しますgit checkout

for i in $(git for-each-ref --format=%(refname:short) \
  --no-merged=origin/HEAD refs/remotes/origin); do \
    git switch --track $i; \
done

そうすれば、grep必要ありません。


古い(2011)元の回答:

これが私が使用する私の1行です(mashgit1.7.4でテストされたbashシェルで):

コピーと貼り付けの場合:

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

より読みやすくするために:

remote=origin ; // put here the name of the remote you want
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do 
    git branch --set-upstream-to $remote/$brname $brname; 
done
  • remote変数で指定したリモートから上流のブランチのみを選択します( ' origin'または現在のGitリポジトリのリモートの1つに設定した名前にすることができます)。
  • origin/a/Branch/Name => a/Branch/Nameを通じてブランチの名前を抽出しawkます。
  • ではなく(またはを介し--set-upstream-to-uて上流のブランチ設定し--trackます
    。利点は、ブランチがすでに存在する場合、失敗せず、ブランチの起点を変更せず、branch.xxx.(remote|merge)設定を構成するだけです。

    branch.aBranchName.remote=origin
    branch.aBranchName.merge=refs/heads/a/Branch/Name
    

このコマンドは、すべてのリモートアップストリームブランチのローカルブランチを作成し、リモートおよびマージ設定をそのリモートブランチに設定します。


5
これにより、リモートにのみ存在し、対応するローカルブランチを持たないすべてのブランチについて、「致命的:ブランチ 'whatever' does not exist '」が得られます。
クリス・ドッド

たとえば、ブランチ名に/が含まれている場合、feature / rc-41-bckendを使用すると、このソリューションは機能しません!!!!
Mohsen Abasi

@VonC「slm」の回答に基づく:$ for i in $(git branch -r | grep -vE "HEAD | master" | sed 's / ^ [] \ + //'); git checkout --track $ iを実行します。完了
Mohsen Abasi

@MohsenAbasiよさそうだ。私の回答では、--set-upstream-to代わりに使用することについて述べまし--trackた。
VonC

@MohsenAbasi視認性を高めるため、回答に代替案を含めました。リモートブランチを一覧表示する別の方法を追加し、のgit switch代わりに使用していますgit checkout。しかし、あなたの(とても良い)アイデアは残っています。
VonC

14

十分簡単に​​スクリプトを作成できますが、それがいつ役立つかはわかりません。これらのブランチはすぐに遅れてしまうため、常に更新する必要があります。

リモートブランチは自動的に最新の状態に保たれるため、実際に作業したい場所にローカルブランチを作成するのが最も簡単です。


2
それは良い点です。私が考えている主なユースケースは、リモートgitリポジトリに基づいてローカル開発環境をセットアップすることです。したがって、最初のクローンを作成するときは、すべてのリモートブランチもその時点での状態で追跡したいと考えています。
Janson

1
ハンディはgit upすべてのローカルブランチを更新します。
Hugo



7

powershellを使用したい場合、リモートはoriginと呼ばれます。その後、これは機能します。

git fetch    
git branch -r  | %{$_ -replace "  origin/"} | %{git branch --track $_ "origin/$_"}

これは、私はそれが私に動作させるためにわずかな変化を使用して終了、スーパー役立ちましたgit svn clone'dレポ:git branch -r | %{$_ -replace " origin/"} | %{git checkout -b $_ "origin/$_"}
ネイト

私の地元の支店が既に存在しているので、私はまた、わずかな変化をした:git branch -r | %{$_ -replace " origin/"} | %{git branch -u "origin/$_" $_}
ch271828n

3
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

これを使用すると、次のような警告は表示されません:refname 'origin / dev'があいまいです


3

@tjmcewanが参照するBASHコマンドの解決策は次のとおりです。

for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done

私の目標は、作成されたすべてのブランチの名前の先頭に「origin /」が含まれるという問題を解決することです。これは、$ remote変数にまだ「origin /」が含まれていることをテストしたためです。

for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done

@tjmcewanのBASHをテストした後、ローカルで 'origin /'なしで追跡されたすべてのブランチの名前が見つかりましたが、その理由はわかりません。
Nick Tsai 2017

1
最初のコマンドは、「マスター」を追跡する支柱を作成します。それはほとんどの人が望むかもしれないものではありません。
Alexei Osipov

@AlexeiOsipovありがとうございます!
Nick Tsai 2017

2

tjmcewanの答えと同じことをするが、Windowsでは、これをバッチファイルから呼び出します

for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r

またはこれはコマンドラインから:

for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r

1

git 2.23以降:

for branch in `git branch -r | grep origin/`; do git switch -t -C ${branch#origin/} $branch; git pull; done

-Cフラグはgit switch、すでに存在する場合は作成またはリセットされます。

gitスイッチのドキュメント


0

すでにいくつかのブランチをチェックアウトしていて、

  • リモートから残りのすべてのブランチをチェックアウトします
  • すべてのローカルブランチがリモートブランチを追跡することを確認してください

次のbashおよびzsh互換のスクリプトを使用できます。

git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done

0
for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"`
do 
    git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch; 
done

説明:

1行目: 'git branch -r'(その後に 'git remote update'を実行して、リモートへの変更に関する情報を更新します)は、すべてのリモートブランチをリストします。'egrep -vw'は、結果にHEADとmasterを持つエントリをノックするために使用されます。

3行目:名前付きリモートブランチをローカルでチェックアウトしながら追跡します。単純なawkを使用して、 'origin /'がローカルブランチのサフィックスにならないようにします。


0

bashを使用して、すべてのブランチをチェックアウトする場合:

for remote in `git branch -r`; do git checkout $(echo $remote | cut -d'/' -f 2); done

新しいリモート追跡ブランチをダウンさせるフェッチを行った場合、それらのローカルの編集可能なコピーは自動的には作成されないことに注意することが重要です。

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