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 switch
commandを使用します。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
このコマンドは、すべてのリモート アップストリーム ブランチのローカル ブランチを作成し、それらのリモートおよびマージ設定をそのリモート ブランチに設定します。