로컬 Git 리포지토리를 사용하여 새로운 원격 리포지토리로 푸시하고 싶습니다 (원하는 경우 Beanstalk에 설정된 새로운 리포지토리).
지역 리포 지에는 몇 개의 지점과 태그가 있으며 모든 내 기록을 유지하고 싶습니다.
기본적으로을 수행 해야하는 것처럼 보이지만 지점 git push만 업로드합니다 master.
리모컨에서 로컬 리포지토리의 전체 복제본을 얻도록 모든 것을 푸시하려면 어떻게해야합니까?
로컬 Git 리포지토리를 사용하여 새로운 원격 리포지토리로 푸시하고 싶습니다 (원하는 경우 Beanstalk에 설정된 새로운 리포지토리).
지역 리포 지에는 몇 개의 지점과 태그가 있으며 모든 내 기록을 유지하고 싶습니다.
기본적으로을 수행 해야하는 것처럼 보이지만 지점 git push만 업로드합니다 master.
리모컨에서 로컬 리포지토리의 전체 복제본을 얻도록 모든 것을 푸시하려면 어떻게해야합니까?
답변:
모든 분기 를 푸시하려면 다음 중 하나를 사용하십시오 (원격 이름으로 REMOTE를 바꾸십시오 (예 : "origin")).
git push REMOTE '*:*'
git push REMOTE --all
모든 태그 를 푸시하려면 :
git push REMOTE --tags
마지막으로 하나의 명령 으로이 모든 것을 할 수 있다고 생각합니다.
git push REMOTE --mirror
그러나 --mirror또한 리모컨을 밀어 넣으므로 원하는 것이 아닐 수도 있습니다.
--all대신에 *:*더 친근 해 보인다
git push REMOTE --all반환 No refs in common and none specified;동안 아무것도하지. git push REMOTE "*:*실제로 원격으로 모든 지점을 밀었다.
git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url입니다.
저와 같은 경우에 당신은 repo를 요구하고 이제 원격 원점을 다른 repo, 새로운 빈 repo로 전환하고 있습니다 ...
그래서 당신은 당신의 레포와 모든 가지를 가지고 있지만 여전히 그 가지를 점검해야합니다. git push --all 실제로 푸시 .
푸시하기 전에이 작업을 수행해야합니다.
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
뒤에
git push --all
git push '*:*'모든 가지를 밀었다. git push -all방금 마스터를 밀었습니다. 리포지를 github에서 bitbucket으로 옮기고있었습니다.
--track remotes/$remote대신 --track $remote. 완전한 명령 행은 다음과 같습니다.for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
여기에 내가있는 상황에 더 잘 맞는 동일한 일이 있습니다. 하나 이상의 리모컨이있는 문제를 해결하고 모든 지점을 원격에서 원격 source으로 복제 하려고합니다.destination 하려고하지만 사전에 모두 확인하지 않아도되는 문제를 해결합니다.
(Daniel의 솔루션에서 내가 가진 문제는 이미 체크 아웃 한 source경우 원격 에서 추적 지점을 체크 아웃 하지 않는 것입니다. 즉, 푸시하기 전에 로컬 지점을 업데이트하지 않습니다)
git push destination +refs/remotes/source/*:refs/heads/*
참고 : 직접 CLI를 사용하지 않는 경우 별표를 이스케이프해야합니다.
git push destination +refs/remotes/source/\*:refs/heads/\*
이렇게하면 원격의 모든 분기 source가의 헤드 분기로 destination푸시되어 빨리 감기되지 않을 수 있습니다. 여전히 태그를 별도로 푸시해야합니다.
remote서로 에게 복제되어 나를 위해 일했습니다 . 감사!
git push destination +refs/remotes/source/\*:refs/heads/\*
--prune옵션 은 옵션 에 대한 작은 예입니다 .
--mirror모든 사람이 권장 하는 일반적인 매개 변수 와는 다른 훌륭한 답변 . 자동화 또는 감사 목적으로 두 개의 원격 동기화를 유지하려는 시나리오에 완벽하게 작동합니다.
목적지가 비어 있으면 이것이 내가 찾은 가장 간결한 방법입니다. 빈 폴더로 전환 한 후 :
# 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적절한 등.
맨 페이지를 git-push읽을 가치가 있습니다. 이 웹 사이트 와 결합 하여 다음과 같은 내용을 작성했습니다 .git/config.
[remote "origin"]
url = …
fetch = …
push = :
push = refs/tags/*
push = :수단 동안, "임의의 '매칭'분기 푸시 (이미 원격 저장소에 존재하는 지점, 즉 로컬 상대가)"push = refs/tags/* 수단"모든 태그를 밀어. "
따라서 이제는 git push일치하는 모든 분기 및 모든 태그를 푸시 하기 위해 실행 해야합니다.
예, 이것은 OP가 원했던 것이 아니며 (푸시 할 모든 브랜치가 이미 원격 측에 있어야 함), "어떻게 브랜치와 태그를 같은 방식으로 푸시합니까?" 시각".
리포지토리 미러링
저장소의 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/
위의 답변에 여전히 명확하지 않은 내용이있어 사용자를 오도 할 수 있습니다. 먼저, 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
이런 식으로 추가 헤드 브랜치를 얻을 수 있습니다.
브랜치 및 태그를 푸시하려면 (원격은 아님) :
git push origin 'refs/tags/*' 'refs/heads/*'
이것은 git이 허용하지 않는에 대한 --tags및 --all옵션 을 결합하는 것과 git push같습니다.
+refs/remotes/source/*
@Daniel 답변을 바탕으로 내가 한 :
for remote in \`git branch | grep -v master\`
do
git push -u origin $remote
done
| grep -v master으로 대체 할 수 있습니다 | sed 's/\*//'( 현재 선택한 지점 앞에 master있는 불쾌한 작은 *것을 피하기 위해 배제 한 것으로 가정합니다 ) . 현재 선택한 지점이 아닌 master경우 문제 를 포함 하고 피할 수 있습니다 master. 또한 네크로 포스트 (necroposting)에 대해 유감스럽게 생각합니다.이 답변이 오늘 저에게 도움이되었으며 다른 사람들이 제 입장에서 도울 수 있다면 수정 사항을 공유하고 싶었습니다.
나는 이것들 중 어느 것도 나를 위해 제대로 작동하지 않는 것으로 나타났습니다. 이것을 불에 태워 버리지 만 어떤 이유로 든 다른 옵션을 제대로 사용할 수 없었습니다.
예상 결과는 다른 리포지토리 (예 : Github에서 다른 공급자로)에 "복제"된 리포지토리입니다.
내가 본 주요 문제는 모든 원격 지점이 새 원격에서 다시 생성되지 않았다는 것입니다. 명령에 따라 새 리모컨에 분기 기록이 없었습니다 (예 :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
아래 명령은 모든 분기를 푸시합니다 ( 체크 아웃하지 않았지만 git repo에git branch -a 있는 분기를 포함 하여 분기 를 볼 수 있습니다 )
git push origin '*:*'
참고 :이 명령은 버전 관리 서비스를 마이그레이션 할 때 유용합니다 ( 예 : Gitlab 에서 GitHub로 마이그레이션 ).
한 버전 관리 서비스에서 다른 버전 관리 서비스로 전환하는 과정에 있었고 모든 지점, 태그 및 기록을 포함한 모든 리포지토리를 복제해야했습니다.
위의 목표를 달성하기 위해 다음을 수행했습니다.
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