すべてのGitブランチをフェッチする方法


1507

約5つのブランチを含むGitリポジトリーを複製しました。しかし、私がそうするgit branchと、そのうちの1つしか表示されません。

$ git branch
* master

すべてのブランチgit branch -aを表示するためにできることは知っていますが、すべてのブランチをローカルにプルするにはどうすればよいgit branchですか?

$ git branch
* master
* staging
* etc...


2
使用した後、すべての枝を取得するにはどのようにこの質問は、ショー--single-branchクローニングする場合の設定を:stackoverflow.com/questions/17714159/...git fetch --all決して仕事をあなたは1つのブランチのみを指定した場合は!)
マシューWilcoxson

2
アスタリスクは現在チェックアウトされているブランチを表すため、その出力は表示されません。一度にチェックアウトできるブランチは1つだけなので、ブランチリストの左側にあるアスタリスクは1つだけです。
ロビノ2015

5
私はたくさんの答えを見ましたが、どれもあなたが望むことをする最も簡単な方法であると私が思うものはどれも言及していません git clone --bare <repo url> .git でした:(リポジトリをa "bare" repo)、then git config --bool core.bare false( "bare"フラグをfalseに設定)、then git reset --hard(HEADをリポジトリの現在のHEADに移動)。これで、git branchクローンしたリポジトリのすべてのブランチが表示されるはずです。
Gabriel Ferraz 2017年

4
@GabrielFerraz次に、スタックオーバーフローのコメント機能を悪用しています。ユーザーはあなたのコメントに賛成投票できますが、反対投票はできません。
パイプ

回答:


2051

次のようにして、すべてのリモートからすべてのブランチをフェッチできます。

git fetch --all

それは基本的に権力移動です。

fetchこれは常に、あなたの地元の支店のために安全であるように、リモートブランチのローカルコピーを更新しかし

  1. fetchローカルブランチ(リモートブランチを追跡する)は更新しません。ローカルブランチを更新したい場合でも、すべてのブランチをプルする必要があります。

  2. fetchローカルブランチ(リモートブランチを追跡する)は作成されません。手動で作成する必要があります。すべてのリモートブランチを一覧表示する場合: git branch -a

リモートブランチを追跡するローカルブランチを更新するには:

git pull --all

ただし、これでもまだ不十分な場合があります。リモートブランチを追跡するローカルブランチでのみ機能します。すべてのリモートブランチを追跡するには、このonelinerを実行し、BEFORE git pull --all

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; DRバージョン

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(プルはすべてのリモートからすべてのブランチをフェッチするようですが、念のため、常に最初にフェッチします。)

ローカルブランチで追跡されていないリモートブランチがサーバーにある場合にのみ、最初のコマンドを実行します。

PS AFAIK git fetch --allgit remote update同等です。



Kamil Szotのコメント

私は使用しなければなりませんでした:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

あなたのコードは名前付きのローカルブランチを作成しorigin/branchname、私がそれを参照するときはいつでも "refname 'origin / branchname'はあいまいです。


42
ごめんなさい。これがOPが実際に望んでいることだとは思えません。「プル」コマンドは「フェッチ+マージ」であり、マージパーツはすべてのブランチを互いの上にオーバーレイし、1つの巨大な混乱を残します。
GoZoner 2012

10
このフェッチでは新しいリモートブランチが作成されないため、チェックアウトする必要がありますgit checkout -b localname remotename/remotebranch
Learath2

125
私が使用していた for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done あなたのコードが原点/ branchnameという名前のローカルのブランチを作成したので、私はそれを参照するたびに、私は「もしrefname 『起源/ branchname』になっていたことはあいまいです。
カミルSzot

22
別のバージョンのGITを使用しているかどうかはわかりませんが、スクリプトをに修正する必要がありましたgit pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done。変更によりHEADが取り除かれます。
kim3er 2013

16
Windowsユーザーの場合:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
最大

719

リモートブランチを一覧表示するには:
git branch -r

あなたはそれらをローカルブランチとしてチェックアウトすることができます:
git checkout -b LocalName origin/remotebranchname


88
これはまさに上記の質問を見つけたときに私が探していたものです。リモートブランチをプルする方法を探している多くの人は、ブランチを現在の作業コピーにマージしたくないのではないかと思いますが、リモートブランチと同じローカルブランチが必要です。
Frug

12
ローカルにブランチが表示されていなくても、私はそれを実行できますgit checkout remotebranchname。あなたのソリューションとの違いは何ですか?
フランソワ・ロメイン

12
そのデフォルトの動作。古いgitバージョンには当てはまりませんでした。をgit checkout remotebranchname使用して、remotebranchnameという名前の新しい無関係なブランチを作成します。
Learath2 2014年

12
受け入れられた回答は根本的に異なる何かを行い、率直に言って、なぜその受け入れられた回答が理由を理解していません
Learath2

8
OPはすべてのブランチを要求しました。この答えは1つだけです。
Ted Bigham 2016

193

リモートブランチを追跡するローカルブランチを作成する必要があります。

と呼ばれるリモートが1つしかないと仮定するとorigin、このスニペットはすべてのリモートトラッキングブランチのローカルブランチを作成します。

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

その後git fetch --all、リモートブランチのすべてのローカルコピーを更新します。

また、git pull --allローカルトラッキングブランチを更新しますが、ローカルコミットと 'merge'構成オプションの設定方法によっては、マージコミットが作成されるか、早送りまたは失敗する可能性があります。


5
これにより、シェルのメタ文字を含むブランチ名に対するソリューションが強化され(他の回答に関するpinkeenのコメントに従って)、偽のエラー出力が回避されます。grep -v-'->' | リモート読み取り中。do git branch --track "$ {remote#origin /}" "$ remote" 2>&1 | grep -v 'はすでに存在しています'; 完了
Daira Hopwood、2015

6
これでgit pull --allすべてのローカル追跡ブランチが更新されますか?私が知る限り、すべてのリモートから現在のブランチのみを更新します。
アンディ

3
これしました リモートブランチと一致するローカルブランチは作成されませんでした。「リモートブランチが存在しない場合、ローカルブランチを作成してすべてのリモートブランチをプルする」と単に言うgitコマンドとは何ですか?
JosephK 2017

@JosephKおそらくリモコンが呼び出されていませんoriginか?すべてのリモート名で機能するこの回答を参照してください。
トム・ヘイル

@TomHaleそれは「起源」でしたが、あなたの答えに感謝します-クレイジーですが、1つまたは2つのフラグであるべきことを行うにはそれだけが必要です。私は現在、gitのいくつかの側面の狂気を回避するために、gitlessを試みています。
JosephK 2018

116

もしあなたがそうするなら:

git fetch origin

その後、それらはすべてローカルに存在します。次に実行する場合:

git branch -a

それらは、remotes / origin / branch-nameとしてリストされます。彼らは地元にいるので、あなたは彼らとあなたが好きなことを何でもできる。例えば:

git diff origin/branch-name 

または

git merge origin/branch-name

または

git checkout -b some-branch origin/branch-name

5
グーグルでこのページを見つけました...これは私が求めていた実際のタイプの答えでした。私は最初のコマンドを試しましたが、エラーを受け取りました:[$ git fetch --all origin fatal:fetch --all does not take a repository argument] ---「git fetch --all」を使用するとうまくいくようです。リードをありがとう!
longda 2013年

1
修正済み(削除済み--all
GoZoner 2013年

12
git fetch -allすべてのリモートのすべてのブランチをフェッチします。 git fetch originリモートのすべてのブランチをフェッチしますorigin。後者はOPが求めていたものです。
GoZoner 2013

3
--all「特定のリモートのすべてのブランチ」ではなく、「すべてのリモート」を意味します。後者は、リモートからのフェッチによって暗示されます。
スペースダイバー2013年

2
これは、リモートリポジトリからローカルリポジトリにすべてのブランチをプルする方法ではありません。
Vladimir Despotovic 2016年

69
$ git remote update
$ git pull --all

これは、すべてのブランチが追跡されることを前提としています。

そうでない場合は、Bashでこれを実行できます。

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

次に、コマンドを実行します。


3
それを試しても、上記と同じ結果が得られます。
David542 2012

4
@JacobLoweと同じで、エラーが発生しましたが、とにかく動作しました。'致命的:' origin / master 'という名前のブランチは既に存在します。
AnneTheAgile 14

`origin / HEAD-> origin / master` ->の出力に存在する可能性が高いブランチを作成しようとするため、これは醜いgit branch -r
Tom Hale

また、動作しません。出力を取得します。Branch 'origin/quote-filenames' set up to track local branch 'master'. 目的の出力は次のとおりです。Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. これは逆方向であり、原点を設定してリモートを追跡します。修正については、この回答を参照してください。
トム・ヘイル

ちょうど私が必要としたもの。Macを切り替えたので、リポジトリを複製した後でも、他のリモートブランチをチェックアウトできgit fetchず、機能しませんでした。したがって、ここでの教訓は、リモートブランチを追跡する必要があるということです。グラシアス!
Victor Ramos

58

Bash forループは機能しませんでしたが、これはまさに私が望んでいたことです。私の起源からのすべてのブランチは、ローカルで同じ名前としてミラーリングされました。

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

以下のMike DuPontのコメントを参照してください。私はこれを分離ヘッドモードのままにするJenkinsサーバーでこれをやろうとしていたと思います。


6
それはfatal: Refusing to fetch into current branch refs/heads/master of non-bare repository単純なクローンの後に生成されます。最初に頭を外さなければなりません。私はこれをしましたgit checkout <SHA>
brannerchinese

6
私の解決策はこれです使用git checkout --detach # detach the headして、git fetch origin \'+refs/heads/*:refs/heads/*
マイク・デュポン

1
--tagsパラメータも使用することを除いて、これは私にとってはうまくいきました。gitの標準的なシンプルなフロントエンドがあったらいいのに、10以上のスタックオーバーフローの答えを必要とするgitのシンプルなものの数はばかげています!
kristianp 2016

1
@kristianp UngitまたはGitKrakenをチェックアウトしましたか?
dragon788

@ dragon788私はgit GUIにSourceTreeを使用してきましたが、スクリプトタスクのより簡単なコマンドラインについて本当に話していました。
kristianp

51

を使用しgit fetch && git checkout RemoteBranchNameます。

それは私にとって非常にうまくいきます...


6
これが新しいベストアンサーです。これが以前は不可能だったのかどうかはわかりませんが、最近のバージョンのGitでは、リモートブランチをチェックアウトしようとしていることがわかり、ローカルトラッキングブランチが自動的にセットアップされます(必要ありません)指定するorigin/branch;それだけで十分ですbranch)。
Neil Traft 2014年

9
これは元の質問に答えません:「すべてのブランチをローカルでプルするにはどうすればよいですか?」それらを1つずつプルしているため、スケーラブルではありません。
ingyhere 2017年

これは私が遭遇したあらゆる状況でリモートブランチを引っ張って許可された唯一の答えだった
エマニュエルBuckshi

38

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

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

  2. 第二段階

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

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

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

    $ git reset --hard
    

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

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


1
隠された枝の言及に賛成。地元の支店の追跡を非常に理解するのに役立ちました。
mburke05 2017年

それは良い答えですが、質問は毎日の使用に何かを意味します。毎回リポジトリを複製するのは実用的ではありません。
Z.クラ

リセットするとローカルですべてのブランチが作成されるのはなぜですか?
Z. Khullah

@ Z.Khullahすべてのブランチを作成するのはリセットではなく、クローン-ミラーです。私たちにとって残念なことに、それはまた、裸のリポジトリを作成します。これは、ステップ2と3が変更されるものです。
ScottJ

29

次の方法ですべてのブランチをフェッチできます。

git fetch --all

または:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000リポジトリを浅くしている場合は、このパラメータが役立つことがあります。


すべてのブランチをプルするには、次を使用します:

git pull --all

上記が機能しない場合は、上記のコマンドの前に次のコマンドを追加します。

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

remote.origin.fetchフェッチ中に特定のブランチのみをサポートする可能性があるため、特にでリポジトリを複製した場合--single-branch。これを確認してください:git config remote.origin.fetch

その後、ブランチをチェックアウトできるはずです。

以下も参照してください。


すべてのブランチをリモートにプッシュするには、次を使用します。

git push --all

最終的--mirrorにすべての参照をミラーリングします。


リポジトリの複製が目的の場合は、GitHubのリポジトリの複製に関する記事を参照してください。


1
すばらしい...このページでは、解決策の前に他のすべてを試しました。どうもありがとう!
Sujoy

2
シャロークローニング(depth=1)を使用し、構成にも特定の1つのブランチを指定しましたfetch-このdepth=1000パラメーターは、特定のリモートブランチをチェックアウトするのに役立つ修正でした
Sandra

2
pull --allすべてのブランチを引っ張るのではなく、すべての
リモートを引っ張る

しかし、設定を使った素晴らしいトリックです!
いつでも

私はあなたが書いたように設定をチェックしましたが、それでも現在のブランチでのみ機能します。ここでのすべての回答が私には
役に立た

25

私は通常、次のようなコマンドしか使用しません。

git fetch origin
git checkout --track origin/remote-branch

少し短いバージョン:

git fetch origin
git checkout -t origin/remote-branch

17

次の方法でリポジトリを複製したと思います。

git clone https://github.com/pathOfrepository

次に、cdを使用してそのフォルダーに移動します。

cd pathOfrepository

入力git statusすると、すべてが表示されます。

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

すべての非表示のブランチタイプを表示するには:

 git branch -a

すべてのリモートブランチが一覧表示されます。

特定のブランチでチェックアウトしたい場合は、次のように入力します。

git checkout -b localBranchName origin/RemteBranchName

16

ここですべてのブランチを取得し、すべてを別のGitサーバーに移行するためのソリューションを探している場合は、以下のプロセスをまとめます。すべてのブランチをローカルで更新するだけの場合は、最初の空の行で停止します。

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

3
非常に役立ちます; まさに私が必要としたもの。変更しなければならないのは2行目だけで、「HEAD」と「master」の前後に一重引用符を追加しました。おそらく私はzshを使用しているためです。ありがとう!
sockmonk 2014

これは基本的には次のことを行います。(1)リモートブランチの実際の名前を取得する(ヘッドではなくマスターではない)。(2)追跡するようにGitに完全に指示します(すべてのソリューションがこれを行うわけではありません)。(3)これらのブランチからすべてをフェッチしてプルします[タグを含む]。(4)新しい原点を設定し、すべてを完全に押し上げてウォークスルーします。繰り返しになりますが、他のほとんどのソリューションでは、すべての要素を移動できません。これはすべてを行います。
ingyhere 2015年

1
grepを実行してからawkを実行するアンチパターンを削除し、grepコマンドをawkコマンドに圧縮しました。tripleeeに感謝!
ingyhere 2017年

これを読んで、決して書き込みgit fetch git pull stackoverflow.com/a/292359/1114926
グリーン

Git pullは実際にfetch最初に実行しますが、問題がwhenの部分から発生したfetchpullか、それとも独立して実行されたときの後続のmerge部分から発生したのかを判断するのは簡単です。pullfetch
ingyhere

12

マスターリポジトリのクローンを作成したら、次のコマンドを実行できます。

git fetch && git checkout <branchname>

1
シンプル。そして、リモートの起源からブランチを取得するために働いた
サーボン

3
これは、元の質問「すべてのブランチをローカルでプルするにはどうすればよいですか?」それらを1つずつプルしているため、スケーラブルではありません。100ブランチの場合を考えてみましょう。
ingyhere 2017年

10

すべてのリモートブランチが.git/configファイルでフェッチ可能であることを確認してください。

この例では、origin/productionブランチをgit fetch --allフェッチする以外に何も実行しようとしても、ブランチのみがフェッチ可能productionです。

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

この行は次のように置き換えます。

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

次に、git fetchetc ...を実行します。


3
検査するには git config --get remote.origin.fetch、次に(破壊)に設定する:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

または.gitディレクトリの構成テキストファイルを変更し、私のために働いた
FDIM

9

ルーピングがうまくいかなかったので、オリジン/マスターは無視したかった。ここに私のために働いたものがあります。

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

その後:

git fetch --all
git pull --all

1
これのバリエーションが正解ですが、これはすべてのエッジケースで機能するわけではありません。また、ブランチ名はファンキーにできます。だから私は次のことをしました:git branch -r | grep -v HEAD | grep –vマスター| awk -F'origin / '' {print $ 2 "" $ 1 "origin /" $ 2} '| xargs -L 1 gitブランチ-f --track; git fetch --all; git pull --all; そして、それはトリックをしました!
ingyhere 14

3
grep | awk アンチパターンを回避するためのスタイルの改善:git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee 2015年

7

これらの3つのコマンドだけですべてのブランチが取得されます。

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

これは実際にはOPの問題の根源です。正しく複製されれば、彼はをする必要はないでしょうpull --all。しかし、それでも必要な場合は、@ Johnno Nolaによる以下の別の回答が、すべてのブランチが追跡され、この回答と混合されていると仮定して、進むべき道です。
Beco博士、

7

なぜ誰もがみんなの質問に答えて何が起こっているのか説明しないのですか?

  1. すべてのリモートブランチ(または追跡したいブランチ)を追跡していることを確認してください。
  2. ローカルブランチを更新して、リモートブランチを反映させます。

すべてのリモートブランチを追跡します。

リモートリポジトリに存在するすべてのブランチを追跡します。

手動で行う:

<branch>の出力から表示されるブランチに置き換えgit branch -rます。

git branch -r
git branch --track <branch>

bashスクリプトでそれを行う

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

ローカルコンピューターのリモートブランチに関する情報を更新します。

これは、ローカルリポジトリで追跡しているリモートリポジトリからブランチの更新をフェッチします。これはローカルブランチを変更しません。ローカルのgit repoは、リモートのrepoブランチで発生したことを認識しています。たとえば、新しいコミットがリモートマスターにプッシュされ、フェッチを実行すると、ローカルマスターが1コミット遅れていることを警告するようになります。

git fetch --all

ローカルコンピューターのリモートブランチに関する情報を更新し、ローカルブランチを更新します。

リモートブランチからローカルブランチへのすべてのブランチに対して、フェッチとそれに続くマージを実行します。たとえば、新しいコミットがリモートマスターにプッシュされ、プルを実行すると、リモートブランチの変更に関するローカルリポジトリが更新され、それらの変更がローカルブランチにマージされます。これはマージの競合のためにかなり混乱を引き起こす可能性があります。

git pull --all

4

新しいリポジトリのクローンを作成し、すべてのリモートブランチにローカルブランチを作成するための小さなスクリプトを書きました。

ここで最新バージョンを見つけることができます:

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

それを使用するには、それをあなたのgit binディレクトリ(私にとってはそれですC:\Program Files (x86)\Git\bin\git-cloneall)にコピーしてから、コマンドラインで:

git cloneall [standard-clone-options] <url>

通常どおりクローンを作成しますが、すべてのリモートブランチに対してローカルトラッキングブランチを作成します。


4

単一のリモートを追跡するすべてのGitブランチをフェッチする方法。

これは、Windows 10のRed HatおよびGit Bashでテストされ、機能しています。


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

説明:

1つのライナーがチェックアウトし、HEADを除くすべてのブランチをフェッチします。

リモート追跡ブランチを一覧表示します。

git branch -r

HEADを無視します。

grep -v ' -> '

リモートからブランチ名を削除します。

cut -d"/" -f2

単一のリモートを追跡するすべてのブランチをチェックアウトします。

git checkout $branch

チェックアウトしたブランチをフェッチします。

git fetch

技術的には、新しいローカルブランチではフェッチは必要ありません。

これは、fetchまたはpull両方で新しく、リモートで変更されたブランチに。

マージする準備ができている場合にのみプルすることを確認してください。


テスト設定

SSH URLのあるリポジトリを確認してください。

git clone git@repository.git

ローカルのブランチをチェックします。

$ git branch
* master

コマンドを実行する

ワンライナーを実行します。

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

ローカルブランチにリモートブランチが含まれていることを確認します。

$ git branch
  cicd
  master
* preprod

4

PowerShellを使用しているWindowsユーザーの場合:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

名前に/を持つ支店を持つこの作品: git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
マルクス

3

ここに私が堅牢だと思うものがあります:

  • 既存のブランチのリモート追跡を更新しません
  • HEAD追跡するために更新を試みませんorigin/HEAD
  • 以外の名前のリモートを許可します origin
  • 適切に引用されたシェル
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

このオプションを内部にgit fetch --all渡す-allためにgit pull渡す必要はありませんfetch

この回答の功績。


2

受け入れられた回答で提供されているワンライナーのPerlバージョンは次のとおりです。

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

必要に応じて、出力ファイルをシェルスクリプトとして実行できます。

Stashプロジェクトリポジトリを誤って削除しました。幸いなことに、誰かが偶発的な損失の直前にフォークを作成していた。私はフォークを地元の人にクローンしました(私がそれをどのように行ったかの詳細は省略します)。地元で完全にフォークを手に入れたら、ワンライナーを1本走らせました。リモートのURL(私の場合はオリジン)を変更して、復旧先のターゲットリポジトリを指すようにしました。

git remote set-url origin <remote-url>

そして最後に、すべてのブランチを次のようにオリジンにプッシュしました:

git push --all origin

そして、私たちはビジネスに戻りました。


1

すべてのブランチ名またはタグ名を一時ファイルに入れてから、名前/タグごとにgit pullを実行できます。

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

1

問題がある場合はfetch --all、リモートブランチを追跡します。

git checkout --track origin/%branchname%

1

エラーメッセージ「致命的:「origin / master」という名前のブランチは既に存在します」を回避するには、次のものが必要です。

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

0

Learath2によって回答に基づいて、ここで私がやった後やったことだgit clone [...]し、cd作成したディレクトリに-ing:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

うまくいきましたが、うまくいくかどうかはわかりません。注意してください。


0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

今ローカルであなたyourNewLocalBranchNameはあなたrequiredRemoteBranchです。


0

Visual Studioユーザーの場合、パッケージマネージャーコンソールで:

gitブランチ| %{git fetchアップストリーム; git mergeアップストリーム/マスター}


0

多くの方法を試しましたが、これだけが簡単で私にとってはうまくいきます。

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

エイリアスを設定:(上位の回答に基づく)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

次に、すべてのブランチを追跡します。

git track-all-branches

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