web-dev-qa-db-ja.com

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

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

$ 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を使いましたが、今のところ二段になっています。

157
Janson

Ottoからの回答は良いですが、作成されたすべてのブランチには名前の先頭に「Origin /」が付きます。最後の部分(最後の/の後)を結果のブランチ名にする場合は、これを使用します。

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

また、あいまいな参照に関する警告を表示しないという利点もあります。

182
tjmcewan

私が使用する私のワンライナーは次のとおりです(bsysシェルで、msysgit1.7.4でテスト済み):

コピー&ペーストの場合:

_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リポジトリのリモートのいずれかに設定した名前を使用できます)。
  • ブランチの名前を抽出します:awk式を介して_Origin/a/Branch/Name => a/Branch/Name_。
  • アップストリームブランチを設定します _--set-upstream-to_を介して(または_-u_を介して であり、_--track_ではありません:
    利点は、ブランチが既に存在する場合、失敗せず、そのブランチのOriginを変更せず、branch.xxx.(remote|merge)設定のみを構成することです。

    _branch.aBranchName.remote=Origin
    branch.aBranchName.merge=refs/heads/a/Branch/Name
    _

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

22
VonC

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

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

12
Dustin
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/Origin/} $i; done
8
Val Blant

スクリプトなし(空のディレクトリ内):

$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout

その後、すべてのリモートブランチはローカルとして認識されます。


オリジナル(ロシア語)

6

Powershellを使用する場合、リモートはOriginと呼ばれます。その後、これは動作します。

git fetch    
git branch -r  | %{$_ -replace "  Origin/"} | %{git branch --track $_ "Origin/$_"}
6
BigMiner

@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
3
Nick Tsai
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

これを使用すると、次のような警告は表示されません。refname 'Origin/dev' is ambiguous

3
bruziuz

tjmcewan's answer と同じことをするが、Windowsでは、これをbatchファイルから呼び出します

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
2
Hugo

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

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

次の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
simonair

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

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

新しいリモートトラッキングブランチをダウンさせるフェッチを行う場合、ローカルの編集可能なコピーが自動的に作成されるわけではないことに注意してください。

0
Jason Chen
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
ksvrgh