Git 원격 URL 변경 후 원격 거부 (얕은 업데이트는 허용되지 않음)


164

서버와 로컬 컴퓨터에서 모두 작업 한 Git 버전 관리 프로젝트가 있습니다. 원래 원격 원본을 로컬 컴퓨터로 설정했지만 이제이를 BitBucket으로 변경하고 싶습니다.

서버에서 나는 명령을 사용했다.

git remote set-url origin bitbucket_address

그러나 이제 프로젝트를 푸시하려고하면 오류가 발생합니다.

 ! [remote rejected] master -> master (shallow update not allowed)

이 원인은 무엇이며 어떻게 해결합니까?


3
로컬 버전을 어떻게 복제 했습니까? git clone --depth?
Sascha Wolf

얼마 전인데 기억이 나지 않습니다. 알아낼 방법이 있습니까?
rwolst

2
라는 이름의 파일이 있어야합니다 shallow당신이 .git폴더.
사샤 울프

예, shallow파일을 볼 수 있습니다 .
rwolst

누락 된 이력을 버리는 (또는 다시 쓰는) 솔루션에 대해서는 stackoverflow.com/a/50996201 을 참조하십시오
caw

답변:


329

git clone --depth <number>로컬 버전을 복제 하는 데 사용한 것 같습니다 . 결과적으로 얕은 복제가 발생 합니다. 이러한 복제의 한 가지 제한 사항은 복제본을 새로운 저장소 로 푸시 할 수 없다는 것 입니다.

이제 두 가지 옵션이 있습니다.

  1. 현재 또는 누락 된 기록에 대해 신경 쓰지 않으면 이 질문을 살펴보십시오.
  2. 전체 기록을 유지하려면 계속 읽으십시오.

그래서 당신은 당신의 역사를 유지하고 싶습니까? 즉, 저장소 를 해제 해야합니다. 이렇게하려면 기존 리모컨을 다시 추가해야합니다.

git remote add old <path-to-old-remote>

그런 git fetch다음 이전 리모콘에서 남은 히스토리를 가져 오는 데 사용 합니다 ( 이 답변 에서 제안한대로 ).

git fetch --unshallow old

이제 새로운 원격 저장소로 들어갈 수 있습니다.


참고 : 복제를 해제 하지 않으면 분명히 기존 리모컨을 다시 제거 할 수 있습니다.


45
킥 스타트 프로젝트를 복제하고 전체 이력을 원하지 않거나 필요로하지 않으면 어떻게됩니까? 피하는 방법이 있습니까?
itamar

9
@itamar 이것은 완전히 유효한 새로운 질문에 대한 좋은 예인 것 같습니다. 이 질문에 연결하여 참조 할 수 있습니다.
사샤 울프

14
새로운 질문으로 질문 stackoverflow.com/questions/29748197/…
itamar

2
참고 git fetch --unshallow특정 지점이 아닌 전체의 repo unshallow 만에 refspec 수 있습니다. 예 :git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
clacke

5
완전히 새로 워진 리포지토리를 만들지 않고 복제 한 리포지토리보다 약간 뒤에있는 리포지토리로 푸시하려는 경우 로컬 참조가 원격 참조를 포함 할 수있을 정도로 깊으면 충분합니다. 당신 origin/master이 그것을 할 oldrepo/master때 당신 보다 20 커밋보다 앞서고 clone --depth 117 git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master번의 로컬 커밋을 한 경우, 당신이 할 수있는 것으로 충분합니다 (일부 오류에 대한 사과), 그리고 당신은 git push oldrepo master사건없이 할 수 있습니다 (git 1.9.0 이상이 필요할 수 있음).
clacke

28

리포지토리가 origin이고 원래 리포지토리가 upstream다음 과 같은 경우 :

git fetch --unshallow upstream

이것은 저에게 효과적이며 가장 인기있는 답변입니다.
Maosheng Wang

11

얕은 초기 커밋 이후에 추가 한 새로운 커밋으로 리포지토리를 그대로 유지하려면 다른 옵션은 다음과 같습니다 . 대화식 rebase로 커밋을 수정하십시오 .

  • 첫 번째 (루트) 커밋을 포함하여 대화식 리베이스를 시작하십시오.

    git rebase --interactive --root
    
  • pick초기 커밋을로 변경하고 edit파일을 저장하고 닫습니다.

    깊이가 1보다 큰 리포를 복제 한 경우 해당 커밋에 대해 동일한 작업을 수행해야 할 수 있습니다. 또는 fixup대화식 리베이스 동안 이들을 모두 실행 하십시오.

  • 이 커밋을 다음과 같이 정규적이고 얕은 커밋으로 변환하십시오.

    git commit --amend --no-edit
    

    또한 커밋 ID가 변경되고이 초기 커밋의 공동 저자로 추가됩니다.

  • 리베이스를 끝내는 것을 잊지 마십시오

    git rebase --continue
    

감사합니다! 원본 리포지토리가 삭제되고 얕은 복사본 만 있으면 매력처럼 작동했습니다.
Vitalii Dmitriev

9

새 저장소를 그대로 푸시하려면 다음을 시도하십시오.

  • 먼저 old git folder현재 리포지토리에서sudo rm -rf .git
  • 그런 다음 자식을 다시 초기화하십시오. git init
  • 그런 다음 새로운 원격 저장소를 추가하십시오. git remote add your-new-repo
  • 그런 다음 밀어 넣으십시오.

이전 버전으로 푸시 할 필요가 없으므로이 솔루션이 더 나은 솔루션이라는 것을 알았습니다. 때때로 이것은 상용구에서 발생할 수 있습니다.
rnpd


@NachPD 다른 솔루션에 "이전 버전으로의 푸시"가 필요하다고 말할 때 무슨 뜻인지 잘 모르겠습니다. 푸시 대신 가져 오기를 의미합니까? 푸시가 필요하지 않기 때문입니다.
사샤 울프

0

--unshallow 가져 오기가 작동하지 않으면 지점에 문제가 있어야합니다. 밀어 넣기 전에 다음 명령으로 수정하십시오.

git filter-branch -- --all

안전 문제 가 있으므로 --unshallow는 작동하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.