次のリモートをセットアップしています。
$ 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
今korg
からrorg
リモートにすべてのリモートブランチをプッシュしたい。どうすればよいか?
回避できる場合は、最初にローカルブランチを作成しないでください。
一時的なリポジトリを作成する簡単なテストでは、これを実行できる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
私はこれを見つけました:
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
refsに対して同じプッシュを行うことができます:
git Push rorg 'refs/tags/*:refs/tags/*'
patthoyt's answer を補完するために、あるリモートから別のリモートにすべてのブランチをプッシュする短いシェルスクリプトを次に示します。
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のような「ポインター」ブランチを除く)に対して、そのrefを宛先リモートにプッシュします。 (${a//$SRC_REMOTE\/}
ビットは、ブランチ名からソースリモート名を削除します。つまり、Origin/master
はmaster
になります。)
これはZshで動作します
git Push rorg 'refs/remotes/korg/*:refs/heads/*'
前の answer で余分なHEAD
ブランチが作成されたため、これを行うための最もクリーンな方法は、ベアリポジトリにクローンを作成し、次にすべてのブランチをリモートにプッシュすることです。 :
git clone --bare <from-repository>
cd <from-repo-dir>
git Push --set-upstream <to-repository> --all
git Push --set-upstream <to-repository> --tags
私があなたが実行すると示唆するスクリプトについては、すべての変更を隠しておくかコミットするのが賢明でしょう。
あるリモートから別のリモートに複数のブランチをプッシュする必要がありました。これらの答えは、ローカルブランチが以前に存在することを必要としました
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」で実行すると、すべてのアップストリームがリモート「リモート名」を追跡するように設定されます。