712

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

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

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

同じ名前の新しいブランチを作成してプルしようとしましたが、機能しません。ブランチのすべてのリモート構成を尋ねられます。どうすれば設定できますか。

4

12 に答える 12

1497

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

git push --all origin

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

于 2012-05-07T08:39:52.570 に答える
150

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

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

常にすべてのブランチをプッシュする場合は、pushrefspecを設定できます。リモートに名前が付けられていると仮定すると、gitconfigoriginを使用できます。

$ 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 / *
        push = + refs / heads / *:refs / heads / *
        push = + refs / tags / *:refs / tags / *
于 2009-12-16T14:38:09.967 に答える
34

プッシュ仕様に+を含めることは、おそらく悪い考えです。これは、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/*'
于 2011-03-08T23:28:38.730 に答える
32

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

~$ 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

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

于 2016-02-13T09:03:02.127 に答える
14

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

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

または、これを1回行っていない場合、またはローカルブランチの移動のみを検討している場合は、ここにある他の応答に記載されているgitconfigコマンドを使用してリポジトリを構成できます。

重要な点は、他の応答はすべてのローカルブランチのみをプッシュすることです。ブランチが代替のREMOTEリポジトリにのみ存在する場合、最初にブランチを追跡せずにブランチを移動することはありません。ここに示されているforループはそれを支援します。

于 2013-04-18T03:37:06.593 に答える
7

すべてのブランチを古いリポジトリから新しいリポジトリに移動する場合は、ローカルリポジトリで、新しいリポジトリにプッシュする前に、既存のオリジンブランチへの各ブランチの追跡を設定する必要があります。そうしないと、すべてのオリジンブランチがに表示されません。新しい起源。各ブランチを追跡またはチェックアウトして手動でこれを行うか、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. gitbranch-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
于 2017-03-29T06:28:46.380 に答える
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
于 2015-01-15T10:14:04.273 に答える
3

あるリモートオリジンから別のリモートオリジンにプッシュする場合は、次を使用できます。

git push newremote refs/remotes/oldremote/*:refs/heads/*

これは私のために働いた。これを参照してください:https ://www.metaltoad.com/blog/git-push-all-branches-new-remote

于 2021-01-21T16:02:11.623 に答える
3

すべてのブランチとタグを転送するために私が働いた完全な手順は、@vikas027と@kumarahulの回答を組み合わせることです。

~$ git clone <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin --mirror
~$ git push new-origin refs/remotes/origin/*:refs/heads/*
~$ git push new-origin --delete HEAD

最後のステップはHEAD、ワイルドカードが原因で、という名前のブランチが新しいリモートに表示されるためです。

于 2021-02-16T12:27:50.310 に答える
2

@kumarahulが投稿したように、ここで最良かつ最も簡単な方法を見つけました。これは私にとって魅力のように機能し、すべてのタグとブランチを元の場所から新しいリモートにプッシュします。

git remote add newremote new-remote-url

git push newremote --tags refs/remotes/origin/*:refs/heads/*

'git push --all -u newremote'を使用しましたが、チェックアウトされたブランチをnewremoteにプッシュするだけです。

Git:すべてのブランチを新しいリモートにプッシュする

キース・デチャント、ソフトウェアアーキテクト

これは、Gitリポジトリで遭遇した可能性のあるシナリオです。たとえば、古いサーバーからのGitリポジトリの作業コピーがあります。ただし、作業コピーしかないため、オリジンにアクセスできません。だからあなたはそれをフォークすることはできません。ただし、リポジトリ全体とすべてのブランチ履歴を新しいリモートにプッシュする必要があります。

これは、作業コピーに古いリモートからの追跡ブランチ(origin / branch1、origin / branch1など)が含まれている場合に可能です。そうした場合、レポと履歴全体が得られます。

しかし、私の場合は数十の支店があり、その一部またはすべてをローカルでチェックアウトしたことはありませんでした。それらをすべて押すことは重いリフトのように見えました。では、どのように進めますか?

私は2つのオプションを特定しました:

オプション1:すべてのブランチをチェックアウトしてプッシュすることで、これを実行できます。また、Bashスクリプトを作成して支援することもできます。ただし、これを行うと、チェックアウトごとに作業ファイルが変更され、リモート追跡ブランチごとにローカルブランチが作成されます。これは、大きなリポジトリでは遅くなります。

オプション2:作業コピーを変更せずにプッシュする2つ目の方法は、各ブランチのチェックアウトを必要とせず、作業コピーに無関係なブランチを作成せず、作業コピーのファイルを変更することさえありません。

古い、アクティブではなくなったリモートが「oldremote」と呼ばれ、新しいリモートが「newremote」と呼ばれる場合、次のコマンドを使用して、リモート追跡ブランチのみをプッシュできます。

git push newremote refs/remotes/oldremote/*:refs/heads/*

場合によっては、ブランチのサブセットのみをプッシュすることも可能です。ブランチ名がスラッシュで名前空間化されている場合(たとえば、oldremote / features / branch3、oldremote / features / branch4など)、「oldremote/features」で始まる名前のリモートトラッキングブランチのみをプッシュできます。

git push newremote refs/remotes/oldremote/features/*:refs/heads/features/*

すべてのブランチをプッシュする場合でも、一部のブランチをプッシュする場合でも、Gitは、新しいローカルブランチを作成したり、作業ファイルに変更を加えたりすることなく、操作全体を実行します。パターンに一致するすべてのトラッキングブランチが新しいリモートにプッシュされます。

このトピックの詳細については、StackOverflowのこのスレッドをご覧ください。

投稿日:2017年10月9日

于 2021-09-24T05:54:43.797 に答える
1

origin構成にハードコーディングしないソリューション

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

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

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

構成にハードコーディングしないのはなぜoriginですか?

ハードコーディングする場合:

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

フェッチは、現代のgitによってすでに処理されています

JakubNarębskiの答えによると:

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

于 2017-06-18T12:25:48.397 に答える
0

まず、リモートgitをloaclに追加します

git remote add remote_name remote_address

そして、あなたが次のコマンドでそれをする必要がある後

git push --all remote_name
于 2022-01-24T17:42:48.543 に答える