簡體   English   中英

Git將分支從一個遠程推送到另一個?

[英]Git push branch from one remote to another?

我設置了以下遙控器:

$ 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遠程。 我怎么做?

如果可以避免,最好不要先為每個分支創建本地分支。

我找到了這個:

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

制作一些臨時存儲庫的快速測試表明您可以構建一個可以執行此操作的 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

為了補充patthoyt 的回答,這里有一個簡短的 shell 腳本,它將所有分支從一個遠程推送到另一個:

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 。)

這適用於 Zsh

注意單引號是必要的,以防止在某些情況下意外的參數擴展。

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

對於我建議您運行的任何腳本,最好隱藏或提交所有更改。

我需要將幾個分支從一個遠程推送到另一個。 這些答案要求當地分支機構以前存在

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”調用它。

可能有更好的方法,即不進行多次推送。

如果您使用我的代碼,您可能想使用憑證緩存,否則您必須多次輸入憑證。

對於窗戶

注意:此腳本適用於 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”運行將設置所有上游以跟蹤遠程“remotename”

由於在上一個答案中創建了額外的HEAD分支,我發現最干凈的方法是克隆到一個裸存儲庫,然后將所有分支推送到遠程,如下所示:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM