한 리모콘에서 다른 리모콘으로 분기를 푸시합니까?


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

이제 나는 모든 원격 지점을 밀어하고자 korg받는 rorg원격. 어떻게합니까?

피할 수 있다면 각 지점마다 로컬 브랜치를 만들지 않는 것이 바람직합니다.


나는 이것에 대한 대답이 이것에 대한 대답과 비슷하다고 생각합니다 : stackoverflow.com/questions/6922700/… .
Legolas

답변:


52

일부 임시 리포지토리를 만드는 빠른 테스트를 통해이를 수행 할 수있는 참조 사양을 구성 할 수 있습니다.

$ 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/) 왜 그렇지 않습니까?
Ali

2
refs/heads/접두사로 원격 분기를 추진하고 있기 때문에 @exaltedone
ДМИТРИЙ МАЛИКОВ

@patthoyts 내가 언급 한 명령을 시도했지만 모든 것을 최신으로 말하지만 원격 A에는 10 개의 지점이 있고 원격 B에는 6 개의 지점이 있으므로 왼쪽 지점을 어떻게 이동할 수 있습니까?
Keshav1234

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 향후 검색 자의 이점에 동의하는 경우 허용되는 답변을 변경 하시겠습니까?
Jonah Graham

1
"git의 새 버전 (어떤 버전?)에서 이것이 정답이되어야한다"고 알다시피, 이것은 모든 공개 자식 버전에서 작동해야합니다. 왜냐하면 푸시 서명과 참조 와일드 카드는 일반적이기 때문입니다
radistao

3
Everything up-to-date개별 분기 작업에서 동일한 작업을 수행하는 동안 아무것도 발생하지 않는 git 2.10.0을 제공 합니다.
user239558

6
방금 전화해야한다고 생각했습니다.이 메소드는라는 원격에 실제 분기를 만드는 것 같습니다 HEAD. 그러나 삭제할 수 있습니다. git push rorg :HEAD
Mark Stickley

1
심판 구조에 익숙하지 않고 태그를 푸시하는 방법을 궁금해하는 사람은 다음 명령을 원합니다 git push rorg refs/tags/*:refs/tags/*.. 어느 것과 동일 git push rorg --tags하지만 이러한 일을 이해하는 것이 좋습니다 :)
Mark Stickley

14

patthoyt의 답변 을 보완하기 위해 모든 분기를 하나의 리모컨에서 다른 리모컨으로 푸시하는 짧은 쉘 스크립트가 있습니다.

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
한 번의 클릭으로해야하는 사람들을 위해 :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"를 사용하여 호출하십시오.

더 나은 방법 이있을 수 있으며 여러 번 푸시 하지 않습니다 .

내 코드를 사용하는 경우 자격 증명 캐싱 을 사용하고 싶을 수 있습니다 . 그렇지 않으면 자격 증명 서버 시간을 입력해야합니다.

창문 :

참고 : 이 스크립트는 linux 용 입니다. 이 경우 "자식 bash는"그것을 실행 스크립트가 작동하지만 설치 뭔가 특별하지 않고 기본 콘솔에서 실행할 수 없습니다.

git config [--global] credential.helper wincred

리눅스

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.