すべてのブランチをプルおよびプッシュするようにgitを設定します


616

新しく作成されたブランチを含め、デフォルトですべてのブランチをプッシュおよびプルしたいと思います。

定義できる設定はありますか?

それ以外の場合、新しいブランチをローカルに追加し、それをサーバーからプルしたい場合、それを行う最も簡単な方法は何ですか?

同じ名前の新しいブランチを作成してプルしようとしましたが、機能しません。ブランチのすべてのリモート構成を要求します。設定方法は?


4
「プルしようとしたが動作しない」詳細をご覧ください。使用しようとしたコマンドを教えてください。
JakubNarębski、2009

回答:


1298

最も簡単な方法は次のとおりです。

git push --all origin

これにより、タグとブランチがプッシュされます。


10
私がSOや他の場所で見つけた数十の回答の中で、これは構成に触れることなく、新しく作成されたローカルブランチをプッシュする最も簡単な方法です。ありがとう!
アンドラーシュSzepesházi

174
また、-u一度追加すると、たとえばgit push --all origin -uトラッキングが設定され、その後は簡単に使用できますgit push
アレック

23
gitバージョン1.7.12.3の場合git push --tags origin、すべてのタグをプッシュするために使用する必要がありました。
thisgeek

17
また、「-all」の代わりに「--mirror」も見てください。これは、より多くのものをプッシュします
Loda

21
警告:クリーンアップしていない(機能、ホットフィックスの)ローカルブランチがたくさんある場合、または適切にクリーンアップしなかった場合(私)、これはリモートをフラッディングします。くそー。そして、剪定をしました。なぜ私の地元の人がたくさんの枝を残したのか分かりません。
ジャック14

147

最新のgitを使用すると、常にすべてのブランチをフェッチしますrefs/remotes/origin/*名前空間へのリモート追跡ブランチとして、git branch -rまたはで表示可能git remote show origin)。

デフォルトでは(push.default設定変数のドキュメントを参照)、一致するブランチをプッシュします。つまり、最初git push origin branchにgitが常にそれをプッシュするようにする必要がありgit pushます。

あなたがしたい場合は、常にすべてのブランチをプッシュする、あなたはプッシュrefspecを設定することができます。リモートに名前が付けられていると仮定すると、git configをorigin使用できます。

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

または.git/config、次のようなものになるようにファイルを直接編集します。

[リモート「元」]
        url = user@example.com:/srv/git/repo.git
        フェッチ= + refs / heads / *:refs / remotes / origin / *
        フェッチ= + refs / tags / *:refs / tags / *
        プッシュ= + refs / heads / *:refs / heads / *
        プッシュ= + refs / tags / *:refs / tags / *

3
@Merc:git push --all originすべてのブランチとタグを一度に公開するのに適していますが、現在のバージョンの「マッチング」セマンティクスまでのデフォルトでは、新しいブランチまたはタグを追加しない限り、後ですべてのブランチをプッシュすることになります... 「デフォルトですべてのブランチをプッシュ[...]するという設定は、記述どおりです。
JakubNarębski2013

答えを改善して、この方法でGitを再構成する方法を追加できます。これは、シンプルモードを設定したユーザーに役立ちます。
デレクソン2014

3
これはgit 2.0以降変更されました。プッシュのデフォルトは単純で、これ以上一致しません。
マイク

私はこれを試してプッシュでエラーが発生しました:(fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' 注:私はgit 2.0を使用しています。これを修正する方法をまだ検討中です。)
Brian Lacy

2
現在のデフォルト値はpush.defaultですsimple
hasanghaforian

32

+をpush仕様に含めることはおそらく悪い考えです。これは、gitが-fなしでも早送り以外のプッシュを喜んで行うことを意味し、リモートサーバーがそれらを受け入れるように設定されている場合、履歴を失う可能性があります。

これだけ試してください:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

--globalこれらのそれぞれにオプションを追加して、これをすべてのリポジトリのグローバルデフォルトにすることもできます。
Ether

残念ながらgitによって+が自動的に追加されますgit remote add
エーテル

27

以下のコマンドを使用して、すべてのブランチを新しいリポジトリに移行しました。

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

:Atlassian StashからAWS CodeCommit(空のレポ)にレポを複製するときは、最後から2番目(つまり、最初にプッシュマスター)コマンドを使用する必要がありました。理由はわかりませんが、(git push new-origin --mirror)を押した後、デフォルトのブランチが以外のブランチを参照していましたmaster


1
リポジトリを別のホストに移動するのに最適です。ありがとうございました!
2016

2
これは確かに唯一の便利な方法です。git push new_origin --all元のすべてのブランチではなく、現在のローカルブランチをnew_originにプッシュするだけを使用します。
yanzi1225627

--bareこれは、通常のリポジトリとは少し異なるリポジトリを作成することに注意して.gitください。ファイルはありますが、ファイルはありません。作業を行わない場合は、これで十分です。--bare--mirror git-scm.com/docs/git-cloneを参照してください
jmmut

すべて.gitファイルのみが含まれ、実際のソースコードは含まれませんが、リモート更新を実行すると、送信元から送信先まですべてが再フェッチされます。
SanthoshM 2017

これは命の恩人でした!この「ミラーの前のマスター」メソッドは、Bitbucketが宛先であり、「マスター」以外の別のブランチがメインブランチであると信じていた問題を修正しました。
Toddius Zho 2018

12

ブランチを古いものから新しいリポジトリに移動していて、古いリポジトリのブランチがすべてローカルにない場合は、まずそれらを追跡する必要があります。

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

次に、新しいリモートリポジトリを追加します。

git remote add bb <path-to-new-repo>

次に、このコマンドを使用してすべてをプッシュできます。

git push -u bb --all

または、これを一度に行わない場合、またはローカルブランチの移動のみを目的としている場合は、他の応答に記載されているgit configコマンドを使用してリポジトリを設定できます。

重要な点は、他の応答はすべてのLOCALブランチのみをプッシュすることです。ブランチが代替のREMOTEリポジトリにのみ存在する場合、ブランチを最初に追跡しないと移動しません。ここで紹介するforループは、これに役立ちます。


ところで、ここでは「origin」の代わりに「bb」を使用しています。これは、元の/古いリポジトリの名前が「origin」であり、まだそのラベルに添付されていると考えられるためです。「bb」はBitbucket用で、元のリポジトリを移動しましたが、「neworigin」のようにもっと適切な名前を付けることもできます。
ランスクリーブランド

2
それは私にはうまくいきませんでした。
最終的に

2
私の知る限り、@ jhsowterコメントによると、これは機能しないはずです。新しく複製されたリポジトリのリモートブランチを追跡するための正しいコマンドは、git branch --track reponame origin/reponameそれ以外の場合は、すべてのリモートブランチを現在のローカルブランチで追跡することです
Pioneer Skies

リポ収集スニペットをに変更しましたgit branch -r | grep -v '\->' | sed 's/ origin\///'。これにより、リモートブランチ名のみが提供されます。
ポールヒックス

6

使用せずにすべてのブランチを表示するには、git branch -a次を実行する必要があります。

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

これですべてのブランチを見ることができます:

git branch

すべてのブランチをプッシュするには:

git push --all

1
λgit

やってるのgit fetch --all
tokhi 2015

4

すべてのブランチを古いものから新しいリポジトリに移動する場合、ローカルリポジトリでは、新しいリポジトリにプッシュする前に、既存のオリジンブランチへの各ブランチのトラッキングを設定する必要があります。そうしないと、すべてのオリジンブランチが表示されません。新しい原点。各ブランチを追跡またはチェックアウトして手動でこれを行うか、1つのライナーを使用します。

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

この1行のコマンドは、このページの他の回答のバージョンに基づいていますが、次の理由から間違いなく優れています。

  1. --trackに1つのパラメーターのみを提供するこのページのこのコマンドの古いバリアントとは異なり、ブランチトラッキングを正しく設定します。したがって、各ブランチは最終的にマスターをトラッキングします-良くありません
  2. ローカルブランチに名前を付けますが、私は個人的には望んでいない「origin /」というプレフィックスを付けません。これは、ブランチを通常にチェックアウトしたときに起こることと一致しています。
  3. 既に発生しているため、追跡マスターをスキップします
  4. 実際には何もチェックアウトしないため、高速です
  5. -> git branch -rの出力でつまずきを回避

次に、オリジンを切り替える場合は、古いオリジンへのリンクを置き換え、新しいリモートをポイントします。最初にbitbucket / github GUIを使用して新しいリモートを作成してください。ただし、ファイルを追加しないでください。マージの問題が発生します。例えば

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

押してください。タグをプッシュするためにも2番目のコマンドが必要であることに注意してください。

git push -u --all origin
git push --tags origin

0

origin設定にハードコーディングのないソリューション

グローバル gitconfigで以下を使用します

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

これはすべてのブランチとすべてのタグをプッシュします

なぜorigin設定にハードコードすべきではないのですか?

ハードコードする場合:

  1. あなたはoriginすべてのリポジトリでリモートとして終わるでしょう。したがって、オリジンを追加することはできませんが、を使用する必要がありますset-url
  2. ツールが別の名前のリモートを作成した場合、すべての設定は適用されません。次に、リモートの名前を変更する必要がありますが、origin(ポイント1から)すでに存在するため、名前の変更は機能しません。

フェッチは最新のgitによってすでに処理されています

JakubNarębskiの回答によると:

最新のgitでは常にすべてのブランチを(リモート追跡ブランチとしてrefs / remotes / origin / *名前空間に)フェッチします

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