Programming

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

procodes 2020. 2. 12. 23:48
반응형

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


로컬 Git 리포지토리를 사용하여 새로운 원격 리포지토리로 푸시하고 싶습니다 (원하는 경우 Beanstalk에 설정된 새로운 리포지토리). 지역 리포 지에는 몇 개의 지점과 태그가 있으며 모든 내 기록을 유지하고 싶습니다. 기본적으로 git push를 수행 해야하는 것처럼 보이지만 마스터 분기 만 업로드합니다. 리모컨에서 로컬 리포지토리의 전체 복제본을 얻도록 모든 것을 푸시하려면 어떻게해야합니까?


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

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

모든 태그 를 푸시하려면 :

git push REMOTE --tags

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

git push REMOTE --mirror

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


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

따라서 repo와 모든 분기가 내부에 있지만 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푸시되어 빨리 감기되지 않을 수 있습니다. 여전히 태그를 별도로 푸시해야합니다.


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

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

push = :동안 수단은 '어떤'일치하는 '가지 (이미 원격 저장소에 존재하고 현지 대응이 즉 지점)을 눌러 " push = refs/tags/*수단"모든 태그를 밀어. "

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

예, 이것은 OP가 원했던 것이 아니며 (푸시 할 모든 브랜치가 이미 원격 측에 있어야 함), "어떻게 브랜치와 태그를 푸시합니까?"를 검색하는 동안이 질문을 찾는 사람들에게 도움이 될 수 있습니다 시각".


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

git push origin --all

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

# 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적절한 등.


리포지토리 미러링

저장소의 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 --allgit 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같습니다.


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

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

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

예상 결과는 다른 리포지토리 (예 : 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

참고 URL : https://stackoverflow.com/questions/6865302/push-local-git-repo-to-new-remote-include-all-branches-and-tags



반응형