146

次のリモートを設定しています。

$ 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

それが避けられるのであれば、できれば最初にそれぞれにローカルブランチを作成せずに。

4

6 に答える 6

238

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

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

そして、tagsrefに対して同じプッシュを行うことができます。

git push rorg 'refs/tags/*:refs/tags/*'
于 2014-01-15T09:28:13.463 に答える
57

いくつかの一時リポジトリを作成する簡単なテストは、これを実行できる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
于 2011-10-19T09:33:15.980 に答える
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ます。)

于 2013-04-19T01:10:57.170 に答える
7

これはZshで機能します

場合によっては、予期しないパラメーターの拡張を防ぐために一重引用符が必要であることに注意してください。

git push rorg 'refs/remotes/korg/*:refs/heads/*'
于 2017-08-04T01:11:51.477 に答える
-1

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

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

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」にコピーし、「shcallBranchCloner.sh」を使用して呼び出します。

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

私のコードを使用する場合は、おそらくクレデンシャルキャッシュを使用する必要があります。それ以外の場合は、クレデンシャルをサーバー単位で入力する必要があります。

Windowsの場合

注:このスクリプトはLinux用です。「gitbash」で実行するとスクリプトは機能しますが、特別なものをインストールせずにネイティブコンソールから実行することはできません。

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」で実行されると、すべてのアップストリームがリモートの「remotename」を追跡するように設定されます。

于 2015-07-22T19:20:05.257 に答える
-1

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

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
于 2019-05-09T16:24:07.327 に答える