198

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

$ 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を調べましたが、これまでのところ二段ベッドになりました。

4

16 に答える 16

194

Otto の回答は適切ですが、作成されたすべてのブランチの名前の先頭は「origin/」になります。最後の部分 (最後の / の後) だけを結果のブランチ名にしたい場合は、これを使用します。

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

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

于 2010-06-23T07:15:08.623 に答える
136

バッシュの使用:

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

クレジット:ヴァル ブラン、エリアス、ヒューゴ

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 はローカル ブランチを優先しているようです。

于 2008-12-19T01:03:15.847 に答える
24

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

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

$()また、廃止された backticks の代わりに使用します。

別の古い回答で述べたように、使用する方git for-each-refおそらく高速です。そして、紛らわしいを置き換える
新しい (Git 2.23+) git switchcommandを使用します。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)元の回答:

これが私が使用するワンライナーです(msysgit1.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
  • ではなく(or )を介し--set-upstream-to-uて上流ブランチを設定します--track:
    利点は、ブランチが既に存在する場合、失敗せず、そのブランチの起点を変更せず、branch.xxx.(remote|merge)設定のみを構成することです。

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

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

于 2011-06-09T23:18:23.250 に答える
15

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

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

于 2008-12-18T20:48:39.057 に答える
10
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done
于 2014-05-07T21:14:17.910 に答える
8

PowerShell を使用する場合、リモートは origin と呼ばれます。次に、これが機能します。

git fetch    
git branch -r  | %{$_ -replace "  origin/"} | %{git branch --track $_ "origin/$_"}
于 2016-03-24T15:20:26.397 に答える
4
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

于 2013-01-21T05:17:02.243 に答える
3

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
于 2014-09-04T19:38:10.417 に答える
1
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 行目: ローカルでチェックアウトしながら、指定されたリモート ブランチを追跡します。「origin/」がローカル ブランチのサフィックスになるのを避けるために、単純な awk が使用されます。

于 2013-10-15T11:57:55.420 に答える
1

すでにいくつかのブランチがチェックアウトされていて、チェックアウトしたい場合

  • リモートから残りのすべてのブランチをチェックアウトする
  • すべてのローカル ブランチがリモート ブランチを追跡するようにする

次の 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
于 2012-06-26T10:19:55.487 に答える