it-source

원격에서 다른 원격으로 분기를 Git push branch?

criticalcode 2023. 8. 9. 20:50
반응형

원격에서 다른 원격으로 분기를 Git push branch?

다음과 같은 원격이 설정되어 있습니다.

$ 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

이제 모든 원격 분기를 에서 원격으로 푸시하려고 합니다. 어떻게 하는 거지?

가급적 피할 수 있다면 각 먼저 로컬 분기를 만들지 않는 것이 좋습니다.

이걸 찾았어요

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

그리고 모든 원격 지점을 korg에서 org로 밀어넣었습니다(지점의 로컬 복사본 없이도).아래 출력을 참조하십시오.

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

So 오리진/BranchNAME:refs/heads/BranchNAME

내 체크인rorg원격:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

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\/}bit는 분기 이름에서 소스 원격 이름을 제거합니다. 즉,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을 source remote로, origin2를 destination remote로 변경하기만 하면 됩니다.이것을 "remoteBranchCloner.sh "에 복사하고 "sh callBranchCloner.sh "을 사용하여 이름을 붙입니다.

여러 번 밀지 않는 더 좋은 방법이 있을 수 있습니다.

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

:

참고: 이 스크립트는 Linux용입니다."gitbash"에서 실행하면 스크립트가 작동하지만 특별한 것을 설치하지 않고는 네이티브 콘솔에서 실행할 수 없습니다.

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 "과 함께 실행되면 원격 'remote name'을 추적하도록 모든 업스트림이 설정됩니다.

의 분때 에.HEAD이전 답변에서 분기를 생성하는 가장 깨끗한 방법은 맨 저장소로 복제한 다음 다음과 같이 모든 분기를 원격으로 푸시하는 것입니다.

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

언급URL : https://stackoverflow.com/questions/7818927/git-push-branch-from-one-remote-to-another

반응형