모든 분기 및 태그를 포함하여 로컬 Gitrepo를 새 원격으로 푸시
저는 새로운 원격 레포(중요하다면 빈스톡에 새로운 레포를 설치)로 밀고 싶은 지역 Git repo가 있습니다.
제 지역 레포에는 몇 개의 지점과 태그가 있으며, 저는 제 모든 역사를 간직하고 싶습니다.
기본적으로 제가 해야 할 일은git push
하지만 그것은 업로드만 할 뿐입니다.master
분점.
원격에서 로컬 보고서의 전체 복제본을 얻으려면 모든 항목을 푸시하는 방법은 무엇입니까?
모든 분기를 푸시하려면 다음 중 하나를 사용합니다(REMOTE를 "origin"과 같은 원격 이름으로 대체).
git push REMOTE '*:*'
git push REMOTE --all
git push REMOTE --tags
마지막으로, 다음과 같은 기능을 통해 이 모든 것을 하나의 명령으로 수행할 수 있습니다.
git push REMOTE --mirror
그러나 에서는 원격도 푸시하므로 사용자가 원하는 것이 아닐 수도 있습니다.
저처럼 리포를 구입하고 원격 오리진을 다른 리포로 전환하는 경우, 새로운 빈 리포...
안에 , 여러분은 그 .git push --all
그것들도 실제로 밀도록 명령합니다.
다음을 누르기 전에 이 작업을 수행해야 합니다.
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
뒤에
git push --all
여기 제가 처한 상황에 더 잘 작용했던 것과 같은 것에 대한 또 다른 견해가 있습니다.둘 의 원격이 합니다. 원격의 분기를 .source
떨어진 곳에destination
사전에 확인하지 않아도 됩니다.
(Daniel 솔루션의 문제는 추적 지점의 체크아웃을 거부한다는 것이었습니다.source
확인한 ),.
git push destination +refs/remotes/source/*:refs/heads/*
참고: 직접 CLI를 사용하지 않는 경우 다음과 같은 별표를 사용하지 않아야 합니다.
git push destination +refs/remotes/source/\*:refs/heads/\*
원에격있모든분푸를시다니합기는에 .source
에 있어서의 주요 지점까지.destination
비고속 푸시를 하고 있을 가능성이 있습니다.태그를 따로 밀어야 합니다.
목적지가 비어 있다면 이것이 제가 찾은 가장 간결한 방법입니다.빈 폴더로 전환한 후 다음을 수행합니다.
# 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 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 개체가 포함된 리포지토리 미러링
리포지토리의 기본 복제본을 만듭니다.예제 사용자 이름을 리포지토리를 소유한 사용자 또는 조직의 이름으로 바꾸고 예제 리포지토리 이름을 복제할 리포지토리의 이름으로 바꿉니다.
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 origin --all
의 맨 git-push
읽을 가치가 있습니다.이 웹사이트와 결합하여 나는 나의 웹사이트에 다음과 같이 썼습니다..git/config
:
[remote "origin"]
url = …
fetch = …
push = :
push = refs/tags/*
그push = :
는 " 원격 를 가진 , 저장소에 이미 )"를 의미하는 반면, ""를 의미합니다.push = refs/tags/*
"모든 태그 표시"를 의미합니다.
그래서 이제는 도망치기만 하면 됩니다.git push
일치하는 분기와 태그를 모두 푸시합니다.
예, 이것은 OP가 원했던 것은 아니지만(푸시할 모든 분기가 이미 원격 측에 존재해야 함), "분기와 태그를 동시에 푸시하는 방법"을 검색하는 동안 이 질문을 찾는 사람들에게 도움이 될 수 있습니다.
내가 가장 좋아하는 (그리고 가장 간단한) 방법
git clone --mirror OLD_GIT_URL
cd NEW_CREATED_FOLDER
git remote add NEW-REMOTE NEW_GIT_URL
git push NEW-REMOTE --mirror
저는 위의 답변들이 여전히 불분명한 것들이 있다는 것을 발견했고, 사용자들을 오도할 것입니다.한 것은 첫째, 확한것입니다.git push new_origin --all
그리고.git push new_origin --mirror
모든 오리진 분기를 복제할 수는 없습니다. 로컬 기존 분기만 new_branch로 복제합니다.
다음은 제가 테스트한 유용한 두 가지 방법입니다.
1,클론 베어 레포에 의해 삭제됩니다.git clone --bare origin_url
그런 다음 폴더를 입력합니다.git push new_origin_url --mirror
.이 당신은 또한 또한당신은로를 사용할 수 git clone --mirror origin_url
,둘다요.--bare
그리고.--mirror
작업 공간을 포함하지 않는 기본 레포를 다운로드합니다.이것을 참조해 주십시오
당신이 2,000 , Gitrepo를 사용합니다.git clone
작업 공간이 으로, 즉, 기, 본을 사용할 수 .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 '*:*'
모든 분기를 로컬 리포지토리로 체크아웃하는 데 사용되는 .sh 스크립트:
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
git branch --track ${branch#remotes/origin/} $branch
done
모든 분기 및 태그가 있는 새 원격으로 기존 리포지토리를 이동하려면 다음을 실행합니다.
cd existing_repo
git remote rename origin old-origin
git remote add origin git@<repo-url.git>
for remote in `git branch -r `; do git checkout --track remotes/$remote ; done
git push -u origin --all
git push -u origin --tags
분기 및 태그를 푸시하는 방법(원격은 푸시하지 않음):
git push origin 'refs/tags/*' 'refs/heads/*'
이는 다음을 결합하는 것과 같습니다.--tags
그리고.--all
을 선택할 수 .git push
그것은 Git이 허락하지 않는 것처럼 보입니다.
저는 https://www.metaltoad.com/blog/git-push-all-branches-new-remote, 이 제게 매력적인 방법으로 작동한다는 것을 알게 되었습니다. 모든 태그와 브랜치를 원점에서 새 리모컨으로 밀어넣을 것입니다.
git remote add newremote new-remote-url
git push newremote --tags refs/remotes/origin/*:refs/heads/*
'git push --all-u new remote'를 사용했는데 체크아웃된 지점만 새 remote로 푸시됩니다.
Git: 모든 분기를 새 원격으로 푸시
Keith Dechant 지음, 소프트웨어 설계자
다음은 Git 저장소에서 발생했을 수 있는 시나리오입니다.오래된 서버의 Gitrepo 작업 복사본이 있습니다.하지만 당신은 작업 복사본만 가지고 있고 원본은 접근할 수 없습니다.그래서 그냥 포크로 할 수는 없습니다.그러나 전체 레포와 모든 지점 기록을 새 리모컨으로 푸시해야 합니다.
작업 복사본에 이전 원격의 추적 분기(origin/branch1, origin/branch1 등)가 포함된 경우 이 작업이 가능합니다.만약 그렇다면, 당신은 전체 레포와 역사를 가지고 있습니다.
하지만 저의 경우 수십 개의 지점이 있었고, 일부 또는 전부 현지에서 체크아웃한 적이 없었습니다.그들을 모두 밀어 올리는 것은 무거운 리프트처럼 보였습니다.어떻게 진행해야 할까요?
두 가지 옵션을 확인했습니다.
옵션 1: 모든 지점을 체크아웃하고 푸시하면 이를 수행할 수 있으며, Bash 스크립트를 작성하여 도움을 줄 수도 있습니다.그러나 이렇게 하면 체크아웃할 때마다 작업 파일이 변경되고 각 원격 추적 분기에 대한 로컬 분기가 생성됩니다.레포가 크면 속도가 느려집니다.
옵션 2: 작업 복사본을 변경하지 않고 밀어넣기 두 번째 방법이 있습니다. 각 분기를 체크아웃할 필요가 없고 작업 복사본에 별도의 분기를 만들지 않으며 작업 복사본의 파일을 수정하지도 않습니다.
오래된 비활성 원격을 "old remote"라고 부르고 새 원격을 "new remote"라고 부르는 경우 다음 명령을 사용하여 원격 추적 분기만 푸시할 수 있습니다.
git push newremote refs/remotes/oldremote/*:refs/heads/*
경우에 따라 분기의 일부만 푸시할 수도 있습니다.분기 이름에 슬래시가 있는 경우(예: 이전 원격/기능/지점3, 이전 원격/기능/지점4 등), "이전 원격/기능"으로 시작하는 이름을 가진 원격 추적 분기만 푸시할 수 있습니다.
git push newremote refs/remotes/oldremote/features/*:refs/heads/features/*
모든 분기를 푸시하든 아니면 일부 분기만 푸시하든 Git는 새 로컬 분기를 만들지 않고 작업 파일을 변경하지 않고 전체 작업을 수행합니다.패턴과 일치하는 모든 추적 분기가 새 원격으로 푸시됩니다.
이 항목에 대한 자세한 내용은 스택 오버플로에서 이 스레드를 확인하십시오.
게시된 날짜:2017년 10월 9일
@Daniel 답변을 기반으로 다음을 수행했습니다.
for remote in \`git branch | grep -v master\`
do
git push -u origin $remote
done
아래 명령은 모든 분기(체크아웃하지 않았지만 Git repo에 있는 분기 포함)를 푸시합니다.
git push origin '*:*'
참고: 이 명령은 버전 제어 서비스를 마이그레이션할 때 유용합니다(즉, Gitlab에서 GitHub로 마이그레이션).
원하는 작업을 수행하는 주요 방법은 및 플래그를 사용하는 것입니다.둘 중 하나를 제외하는 것은 여러분이 원하는 것의 일부를 밀어내지 않을 것입니다.안타깝게도 함께 사용할 수 없으므로(이유를 알 수 없음) 차례로 실행해야 합니다.
git push --all
git push --tags
관련된 또 다른 옵션은 원격에서 로컬로 존재하지 않는 분기/태그를 제거하는 옵션입니다.
또는 기본적으로 다음과 동일한 옵션을 고려합니다.--all --tags --prune
.
git push --mirror
저는 이것들 중 어느 것도 저에게 제대로 작동하지 않는 것 같다는 것을 발견했습니다.자유롭게 이것을 불태워 죽이지만 어떤 이유에서인지 다른 옵션들이 제대로 작동하지 않았습니다.
예상 결과는 다른 원격(즉, Github에서 다른 공급자로)에 "복제"된 레포였습니다.
- 모든 분기가 새 원격에 생성됩니다.
- 모든 분기 기록이 새 원격에서 생성됩니다.
- (이것은 제가 시도한 모든 솔루션에서 누락되었습니다.)
- 모든 태그가 새 원격에서 생성됩니다.
- 소스 이동(특정)
- 비파괴( --mirror 옵션을 일시 중지함)
제가 본 주요 문제는 모든 원격 지점이 새 원격에서 다시 생성되지 않았다는 것입니다.실행된 새기록이 즉, 명이실경실분없기다습중니록이기에컨모행리된령행새우실▁(▁a(중▁if다없니▁the습ie▁did▁history▁the기록▁did행▁branch▁not이).git checkout branch; git log
예상된 분기 커밋을 표시하지 않음).
저도 알고 있어요.git checkout -b branchname
와 동일하지 않습니다.git checkout branchname
(후자가 제가 필요로 했던 것입니다.)나는 알아차렸습니다git checkout --track branchname
분기 기록을 끌어내는 것처럼 보이지 않았습니다.
내 솔루션(파워셸 기반):
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
모든 분기 및 태그를 포함하여 로컬 Gitrepo를 새 원격으로 푸시할 때 [원격 거부]가 해결되었습니다.
git clone --mirror old-repo
cd <name-repo.git>
git remote new-repo 추가
git push new -- 미러
제가 이것을 하는 방법을 구글에 검색할 때마다 저는 결국 같은 스레드를 읽게 됩니다. 하지만 그것은 제가 필요한 곳에 제가 있어야 할 곳에 저를 데려가지 못합니다. 그래서 바라건대 이것이 제 미래의 자신과 다른 사람들에게도 도움이 될 것입니다.
저는 제 레포(BitBucket)에 적용하고 싶은 새로운 로컬 프로젝트를 시작했습니다.제가 한 일은 다음과 같습니다.
- 로컬 프로젝트 루트로 이동
- 다으로시작:
git init
- 다음과 같은 을 모두 합니다.
git add .
- 대상: 커밋대:
git commit -m "Initial commit"
- 내 보고서로 이동(비트 버킷)
- : 새리지리만들:
new_project
- 로컬 프로젝트로 돌아가기
- 사용하여 :
git remote add origin git@bitbucket.org:AndrewFox/new_project.git
- 을 사용하여 커밋을 .
git push origin master -f
그-f
플래그는 푸시를 강제하는 것입니다. 그렇지 않으면 두 repo가 서로 달라 실패함을 식별합니다.
언급URL : https://stackoverflow.com/questions/6865302/push-local-git-repo-to-new-remote-including-all-branches-and-tags
'source' 카테고리의 다른 글
UIButton 제목 색상을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.06 |
---|---|
App_Code에 있는 클래스에 액세스할 수 없습니다. (0) | 2023.05.06 |
테이블 값 함수에서 변수 선언 (0) | 2023.05.06 |
Postgre로 SQL 덤프 가져오기SQL 데이터베이스 (0) | 2023.05.06 |
Git 하위 모듈에서 변경사항을 "커밋"하려면 어떻게 해야 합니까? (0) | 2023.05.06 |