Gitはブランチをあるリモートから別のリモートにプッシュしますか?


133

次のリモコンをセットアップしました:

$ git remote 
korg
rorg

そして次のブランチ:

$ git branch -a
* (no branch)
  remotes/korg/gingerbread
  remotes/korg/gingerbread-release
  remotes/korg/honeycomb
  remotes/korg/honeycomb-mr1-release
  remotes/korg/master
  remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
  remotes/m/gingerbread -> korg/gingerbread

今、私はからすべてのリモートブランチをプッシュしたいkorgrorgリモート。それ、どうやったら出来るの?

回避可能であれば、最初に各ローカルブランチを作成しないことが好ましい。


これに対する答えは、この答え:stackoverflow.com/questions/6922700/…に相当すると思います。
レゴラス'19年

回答:


52

いくつかの一時的なリポジトリを作成する簡単なテストは、これを実行できるrefspecを作成できることを示しています。

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

したがって、origin / BRANCHNAME:refs / heads / BRANCHNAME

rorgリモコンをチェックインする:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

5
代わりにgit push rorg origin/one:one(なしでrefs/heads/)なぜしないのですか?
2013年

2
@exaltedであるためrefs/heads/、プレフィックスは、リモートにcheckoutedする必要はありませんので分岐鎖状のプッシュしているone
ДМИТРИЙМАЛИКОВ

@patthoyts私は言及されたコマンドを試してみましたが、すべて最新のものですが、リモートAに10のブランチとリモートBに6のブランチがあります。
Keshav1234 2018年

219

私はこれを見つけました:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

そしてそれは私のすべてのリモートブランチをkorgからrorgにプッシュしました(ブランチのローカルコピーがなくても)以下の出力を参照してください。

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

そして、あなたはtags参照に対して同じプッシュをすることができます:

git push rorg 'refs/tags/*:refs/tags/*'

2
十分新しい(どのバージョンの)gitでは、これは受け入れられる答えになるはずです。@ bjarke-freund-hansen将来の検索者の利益に同意する場合、承認された回答を変更しますか?
ジョナグラハム、

1
私が知っているように、これらのプッシュ署名およびリファレンスワイルドカードは共通しているので、これは、すべての公共のgitのバージョンのために働く必要があります「のgitの新十分な(?どのバージョン)では、これが受け入れ答えなければなりません」
radistao

3
私を与えるEverything up-to-date個々の支店の作品に同じことをやっている間、何も起こっとgitの2.10.0に。
user239558 2017

6
私はこれを呼び出す必要があると思っただけです:このメソッドはと呼ばれるリモートに実際のブランチを作成するようHEADです。しかし、それは削除できます。 git push rorg :HEAD
Mark Stickley 2017

1
refs構造に慣れておらず、タグをプッシュする方法を知りたくない人は、次のコマンドが必要です git push rorg refs/tags/*:refs/tags/*。これはと同じですが、git push rorg --tagsこれらが何をしているかを理解するのは良いことです:)
Mark Stickley

14

patthoytの答えを補足するために、すべてのブランチを1つのリモートから別のリモートにプッシュする短いシェルスクリプトを次に示します。

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

要約すると、ソースリモートの各リモートブランチ(HEADのような「ポインター」ブランチを除く)について、その参照を宛先リモートにプッシュします。(${a//$SRC_REMOTE\/}ビットはブランチ名からソースのリモート名を取り除きます、つまりにorigin/masterなりmasterます。)


3
1回のプッシュでそれを実行する必要がある私たちのために:git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Jayen


0

私があなたに実行を勧めるスクリプトについては、すべての変更を隠しておくかコミットするのが賢明でしょう。

あるリモートから別のリモートにいくつかのブランチをプッシュする必要がありました。これらの回答では、ローカルブランチが以前から存在している必要がありました

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

origin1をソースリモートに変更し、origin2を宛先リモートに変更するだけです。これを「remoteBranchCloner.sh」にコピーし、「sh callBranchCloner.sh」を使用して呼び出します。

いくつかのプッシュを行わないより良い方法があるかもしれません

私のコードを使用する場合は、おそらく資格情報のキャッシュを使用する必要があります。それ以外の場合は、資格情報をサーバー時間入力する必要があります。

Windowsの場合

注:このスクリプトはLinux用です。あなたがいる場合、「gitのはbash」でそれを実行するスクリプトは動作しますが、インストール何か特別なことなく、ネイティブのコンソールから、それを実行することはできません。

git config [--global] credential.helper wincred

Linuxの場合

git config [--global] credential.helper cache

[--global]は、オプションで--globalを追加することを意味します

すべてのブランチのリモートトラッキングを新しいリモートに設定する場合:

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

.shファイルとして保存され、「sh filename.sh」で実行すると、すべてのアップストリームがリモートの「リモート名」を追跡するように設定されます。


0

HEAD前の回答で追加のブランチが作成されているため、これを行うことがわかった最もクリーンな方法は、次のようにベアリポジトリにクローンを作成し、すべてのブランチをリモートにプッシュすることです。

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.