web-dev-qa-db-ja.com

あるリモートから別のリモートへのGit Pushブランチ?

次のリモートをセットアップしています。

$ 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リモートにすべてのリモートブランチをプッシュしたい。どうすればよいか?

回避できる場合は、最初にローカルブランチを作成しないでください。

112

一時的なリポジトリを作成する簡単なテストでは、これを実行できる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
43
patthoyts

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

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/*'
198
radistao

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/mastermasterになります。)

14
blahdiblah

これはZshで動作します

git Push rorg 'refs/remotes/korg/*:refs/heads/*'
4
Dongfang Zhu

前の 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
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
csga5000