모든 지사 및 태그를 포함하여 로컬 Git 리포지를 새로운 리모컨으로 푸시


551

로컬 Git 리포지토리를 사용하여 새로운 원격 리포지토리로 푸시하고 싶습니다 (원하는 경우 Beanstalk에 설정된 새로운 리포지토리).
지역 리포 지에는 몇 개의 지점과 태그가 있으며 모든 내 기록을 유지하고 싶습니다.

기본적으로을 수행 해야하는 것처럼 보이지만 지점 git push만 업로드합니다 master.

리모컨에서 로컬 리포지토리의 전체 복제본을 얻도록 모든 것을 푸시하려면 어떻게해야합니까?


가장 짧고 쉬운 답변 -stackoverflow.com/a/39992258/6648326 .
MasterJoe2

답변:


898

모든 분기 를 푸시하려면 다음 중 하나를 사용하십시오 (원격 이름으로 REMOTE를 바꾸십시오 (예 : "origin")).

git push REMOTE '*:*'
git push REMOTE --all

모든 태그 를 푸시하려면 :

git push REMOTE --tags

마지막으로 하나의 명령 으로이 모든 것을 할 수 있다고 생각합니다.

git push REMOTE --mirror

그러나 --mirror또한 리모컨을 밀어 넣으므로 원하는 것이 아닐 수도 있습니다.


53
--all대신에 *:*더 친근 해 보인다
Idan K

56
나의 신 ............. 나는 전체 인터넷을 찢어 버렸다. 그리고 --all 스위치가 AAAAALLLLLLLLLLLLLLLL 내가 필요하다는 것을 알았다!
Rakib

21
그냥 것을주의 git push REMOTE --all반환 No refs in common and none specified;동안 아무것도하지. git push REMOTE "*:*실제로 원격으로 모든 지점을 밀었다.
Im0rtality

10
REMOTE에 갱신에 당신이 정말로 원하는하지 않는 것이 당신이 "TMP"또는 로컬 "기능"지점을 가지고 경우에, 무슨 일이 일어날 지 검사 --dry-실행을 사용
조노

55
원래 리모컨을 계속 사용할 수 있으면 좋은 방법 git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url입니다.
Suzanne Dupéron

156

저와 같은 경우에 당신은 repo를 요구하고 이제 원격 원점을 다른 repo, 새로운 빈 repo로 전환하고 있습니다 ...

그래서 당신은 당신의 레포와 모든 가지를 가지고 있지만 여전히 그 가지를 점검해야합니다. git push --all 실제로 푸시 .

푸시하기 전에이 작업을 수행해야합니다.

for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

뒤에

git push --all

4
모든 지점을 수동으로 체크 아웃해야했기 때문에 이것은 매우 유용합니다. 이것은 다음에 좋을 것입니다.
Cory Imdieke

10
이상하게도 git push '*:*'모든 가지를 밀었다. git push -all방금 마스터를 밀었습니다. 리포지를 github에서 bitbucket으로 옮기고있었습니다.
jerrymouse

3
모든 단일 브랜치를 체크 아웃하는 대신 "git branch --track $ remote"를 수행하면됩니다. 이전 분기 체크 아웃 거대한 REPOS에서 언젠가 소요
Moataz Elmasry

2
이 작업을 수행하려면 약간 변경해야했습니다. --track remotes/$remote대신 --track $remote. 완전한 명령 행은 다음과 같습니다.for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
Adrian T

고마워, 그것은 나를 위해 작동, 위의 대답은 잘 작동하지 않습니다.
Benyamin Jafari

90

여기에 내가있는 상황에 더 잘 맞는 동일한 일이 있습니다. 하나 이상의 리모컨이있는 문제를 해결하고 모든 지점을 원격에서 원격 source으로 복제 하려고합니다.destination 하려고하지만 사전에 모두 확인하지 않아도되는 문제를 해결합니다.

(Daniel의 솔루션에서 내가 가진 문제는 이미 체크 아웃 한 source경우 원격 에서 추적 지점을 체크 아웃 하지 않는 것입니다. 즉, 푸시하기 전에 로컬 지점을 업데이트하지 않습니다)

git push destination +refs/remotes/source/*:refs/heads/*

참고 : 직접 CLI를 사용하지 않는 경우 별표를 이스케이프해야합니다.

git push destination +refs/remotes/source/\*:refs/heads/\*

이렇게하면 원격의 모든 분기 source가의 헤드 분기로 destination푸시되어 빨리 감기되지 않을 수 있습니다. 여전히 태그를 별도로 푸시해야합니다.


8
+1 이것은 remote서로 에게 복제되어 나를 위해 일했습니다 . 감사!
Laurence

4
별표를 피해야했습니다.git push destination +refs/remotes/source/\*:refs/heads/\*
mattalxndr

2
나에게 이것은 HEAD라는 브랜치를 밀어 넣었다.이 시나리오에서는 의도하지 않았다고 생각한다.
maxwellb

1
이 답변은 나에게 매우 유용했습니다. 별표 사용에 대한 git-push (1) 매뉴얼 페이지에 언급 된 유일한 --prune옵션 은 옵션 에 대한 작은 예입니다 .
laindir

4
--mirror모든 사람이 권장 하는 일반적인 매개 변수 와는 다른 훌륭한 답변 . 자동화 또는 감사 목적으로 두 개의 원격 동기화를 유지하려는 시나리오에 완벽하게 작동합니다.
Vinicius Xavier

15

목적지가 비어 있으면 이것이 내가 찾은 가장 간결한 방법입니다. 빈 폴더로 전환 한 후 :

# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git

대체 https://...에 대한 file:///your/repo적절한 등.


13

맨 페이지를 git-push읽을 가치가 있습니다. 이 웹 사이트 와 결합 하여 다음과 같은 내용을 작성했습니다 .git/config.

[remote "origin"]
    url = …
    fetch = …
    push = :
    push = refs/tags/*

push = :수단 동안, "임의의 '매칭'분기 푸시 (이미 원격 저장소에 존재하는 지점, 즉 로컬 상대가)"push = refs/tags/* 수단"모든 태그를 밀어. "

따라서 이제는 git push일치하는 모든 분기 및 모든 태그를 푸시 하기 위해 실행 해야합니다.

예, 이것은 OP가 원했던 것이 아니며 (푸시 할 모든 브랜치가 이미 원격 측에 있어야 함), "어떻게 브랜치와 태그를 같은 방식으로 푸시합니까?" 시각".


13

제 경우에는 효과가있었습니다.

git push origin --all

4
간단하고 쉽습니다. 효과가있다! origin원격 URL Git 저장소의 별명입니다.
Nhu Vy

8

리포지토리 미러링

저장소의 Bare 복제본을 작성하십시오.

git clone --bare https://github.com/exampleuser/old-repository.git

새 저장소로 미러 푸시하십시오.

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git

1 단계에서 작성한 임시 로컬 저장소를 제거하십시오.

cd ..
rm -rf old-repository.git

Git Large File Storage 객체가 포함 된 저장소 미러링

저장소의 Bare 복제본을 작성하십시오. 예제 username을 저장소를 소유 한 개인 또는 조직의 이름으로 바꾸고 예제 저장소 이름을 복제하려는 저장소의 이름으로 바꾸십시오.

git clone --bare https://github.com/exampleuser/old-repository.git

방금 복제 한 저장소로 이동하십시오.

cd old-repository.git

저장소의 Git Large File Storage 객체를 가져옵니다.

git lfs fetch --all

새 저장소로 미러 푸시하십시오.

git push --mirror https://github.com/exampleuser/new-repository.git

저장소의 Git Large File Storage 오브젝트를 미러로 푸시하십시오.

git lfs push --all https://github.com/exampleuser/new-repository.git

1 단계에서 작성한 임시 로컬 저장소를 제거하십시오.

cd ..
rm -rf old-repository.git

위의 지침은 Github 도움말에서 가져옵니다 : https://help.github.com/articles/duplicating-a-repository/


1
이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다. 더 나은 "링크 기반"답변 을 작성하는 방법에 대한 지침 은 여기 를 참조 하십시오 . 감사!
GhostCat

5

위의 답변에 여전히 명확하지 않은 내용이있어 사용자를 오도 할 수 있습니다. 먼저, git push new_origin --all그리고git push new_origin --mirror 원산지의 모든 지점을 복제 할 수 없습니다, 그것은 단지 당신의 new_origin에 가까운 존재 지점을 복제.

아래는 내가 테스트 한 두 가지 유용한 방법입니다.

1, 클론 베어 레포에 의해 복제. git clone --bare origin_url다음 폴더를 입력 한 git push new_origin_url --mirror뒤입니다 이런 식으로, 당신은 또한 사용할 수 있습니다 git clone --mirror origin_url, 모두 --bare--mirror작업 공간을 포함하지 않는 베어 REPO를 다운로드합니다. 이것을 참조 하십시오

당신이 사용하여 자식의 repo 경우 2, git clone맨발의 repo와 자식 작업 공간이있는 수단을, 당신이 사용할 수있는 git remote add new_origin new_origin_url다음 git push new_origin +refs/remotes/origin/\*:refs/heads/\*다음과git push new_origin --tags

이런 식으로 추가 헤드 브랜치를 얻을 수 있습니다.


2

브랜치 및 태그를 푸시하려면 (원격은 아님) :

git push origin 'refs/tags/*' 'refs/heads/*'

이것은 git이 허용하지 않는에 대한 --tags--all옵션 을 결합하는 것과 git push같습니다.


다른 리모컨에서 푸시 할 수있는 추가 옵션이 있습니까? 예 :+refs/remotes/source/*
Yves Martin

2

@Daniel 답변을 바탕으로 내가 한 :

for remote in \`git branch | grep -v master\`
do 
    git push -u origin $remote
done

2
더 나은 방법 | grep -v master으로 대체 할 수 있습니다 | sed 's/\*//'( 현재 선택한 지점 앞에 master있는 불쾌한 작은 *것을 피하기 위해 배제 한 것으로 가정합니다 ) . 현재 선택한 지점이 아닌 master경우 문제 를 포함 하고 피할 수 있습니다 master. 또한 네크로 포스트 (necroposting)에 대해 유감스럽게 생각합니다.이 답변이 오늘 저에게 도움이되었으며 다른 사람들이 제 입장에서 도울 수 있다면 수정 사항을 공유하고 싶었습니다.
ToVine

1

나는 이것들 중 어느 것도 나를 위해 제대로 작동하지 않는 것으로 나타났습니다. 이것을 불에 태워 버리지 만 어떤 이유로 든 다른 옵션을 제대로 사용할 수 없었습니다.

예상 결과는 다른 리포지토리 (예 : Github에서 다른 공급자로)에 "복제"된 리포지토리입니다.

  • 모든 지점은 새로운 리모컨으로 생성됩니다
  • 모든 지점 이력은 새로운 리모콘에서 생성됩니다
    • (이것은 내가 시도한 모든 솔루션에서 누락되었습니다)
  • 모든 태그는 새로운 리모컨에서 생성됩니다
  • 소스가 이동 함 (주어진)
  • 비파괴 적 (--mirror 옵션에 일시 중지)

내가 본 주요 문제는 모든 원격 지점이 새 원격에서 다시 생성되지 않았다는 것입니다. 명령에 따라 새 리모컨에 분기 기록이 없었습니다 (예 :git checkout branch; git log , 예상 분기 커밋을 표시하지 않음).

나는 (후자가 내가 필요한 것) git checkout -b branchname과 같지 않다는 것을 알았다 git checkout branchname. I 통지는 git checkout --track branchname분기 기록을 당겨을하지 않은 것으로 보입니다.

내 솔루션 (powershell 기반) :

Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]

Foreach ($entry in (git branch -r)) {

If ($entry -like "*->*") {
  $branch = $entry.split("->")[2].split("/")[1]
}
  else {$branch = $entry.split("/")[1]}

Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow

git checkout $branch

Remove-Variable branch -Force

""}

#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}

git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure

1

아래 명령은 모든 분기를 푸시합니다 ( 체크 아웃하지 않았지만 git repo에git branch -a 있는 분기를 포함 하여 분기 를 볼 수 있습니다 )

git push origin '*:*'

참고 :이 명령은 버전 관리 서비스를 마이그레이션 할 때 유용합니다 ( 예 : Gitlab 에서 GitHub로 마이그레이션 ).


1
버전 관리 서비스와 마이그레이션 사이에서 마이그레이션하는 것이 바로 내가 찾는 것입니다.
Luka Špoljarić

1

한 버전 관리 서비스에서 다른 버전 관리 서비스로 전환하는 과정에 있었고 모든 지점, 태그 및 기록을 포함한 모든 리포지토리를 복제해야했습니다.

위의 목표를 달성하기 위해 다음을 수행했습니다.

  • 모든 지점을 로컬 리포지토리에 수동으로 체크 아웃합니다 (아래 표시된 모든 것을 체크 아웃하는 스크립트).
  • git push origin '*:*'

모든 저장소를 로컬 저장소로 체크 아웃하는 데 사용되는 .sh 스크립트 :

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.