programing

Git Push 오류: 체크아웃된 분기 업데이트 거부

muds 2023. 7. 10. 23:00
반응형

Git Push 오류: 체크아웃된 분기 업데이트 거부

일부 병합 충돌을 해결하고 커밋한 다음 변경 내용을 푸시하려고 시도했지만 다음 오류가 발생했습니다.

c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'

이 오류의 원인이 무엇인지 아는 사람이 있습니까?

이유: 베어가 아닌 리포지토리로 푸시 중입니다.

저장소에는 베어비베어의 두 가지 유형이 있습니다.

맨 리포지토리에는 작업 복사본이 없으므로 해당 리포지토리에 푸시할 수 있습니다.Github에서 얻을 수 있는 저장소 유형입니다!맨 저장소를 생성하려면 다음을 사용할 수 있습니다.

git init --bare

, 비베어 저장소푸시할 없습니다(편집:현재 체크아웃된 리포지토리 분기로 이동할 수 없습니다.기본 리포지토리를 사용하면 체크아웃된 분기가 없으므로 원하는 분기로 푸시할 수 있습니다.가능하지만, 비어 있는 리포지토리로 푸시하는 것은 일반적이지 않습니다.다른 리포지토리에서 가져와서 병합할 수 있습니다.이것이 그 방법입니다.pull requestGithub 작품에서 볼 수 있는.당신은 그들에게 당신에게서 손을 떼라고 요구하고, 그들에게 강요하지 않습니다.


업데이트: 이 점을 지적해 준 VonC 덕분에 최신 Git 버전(현재 2.3.0)에서는 비베어 저장소의 체크아웃된 분기로 푸시가 가능합니다.그럼에도 불구하고, 여러분은 여전히 더러운 작업 트리로 밀 수 없으며, 이것은 어쨌든 안전한 작업이 아닙니다.

이 문제를 해결하려면 먼저 리모컨에 체크아웃된 항목이 없는지 확인한 다음 다음 항목을 사용하여 확인해야 합니다.

$ git config --bool core.bare true

그 후로 Git push는 잘 작동했습니다.

요약

저장소의 체크아웃된 분기는 해당 저장소의 사용자와 혼동되어 데이터 및 기록 손실로 끝날 가능성이 높기 때문에 해당 분기로 푸시할 수 없습니다.그러나 동일한 리포지토리의 다른 분기로 푸시할 수 있습니다.

맨 리포지토리에는 체크아웃된 분기가 없으므로 맨 리포지토리의 모든 분기로 언제든지 푸시할 수 있습니다.

문제의 부검

분기를 체크아웃할 때 커밋하면 현재 분기의 헤드를 상위 항목으로 하는 새 커밋이 추가되고 분기의 헤드가 해당 새 커밋으로 이동합니다.

그렇게

A ← B
    ↑
[HEAD,branch1]

된다

A ← B ← C
        ↑
    [HEAD,branch1]

그러나 만약 누군가가 그 사이의 분기를 푸시할 수 있다면, 사용자는 git이 분리된 헤드 모드라고 부르는 상태가 될 것입니다.

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

이제 사용자는 다른 분기를 체크아웃하도록 명시적으로 요청하지 않고 더 이상 branch1에 있지 않습니다.더 나쁜 것은 사용자가 이제 분기 외부에 있으므로 새로운 커밋이 중단된다는 것입니다.

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

가설적으로, 이 시점에서 사용자가 다른 지점을 체크아웃하면, 이 매달리는 커밋은 Git의 쓰레기 수집가들에게 공정한 게임이 됩니다.

저는 다음과 같은 이점이 있었습니다.

git config --global receive.denyCurrentBranch updateInstead

Git를 사용하여 Windows 10 데스크톱과 Windows 10 노트북 간에 동기화할 수 있도록 드라이브 F:를 거의 전체적으로 설정했습니다.저는 두 기계에서 위의 명령어를 실행하게 되었습니다.

먼저 네트워크에서 데스크톱의 F 드라이브를 공유했습니다.그런 다음 다음을 실행하여 노트북에 복제할 수 있었습니다.

F:
git clone 'file://///DESKTOP-PC/f'

안타깝게도 모든 파일이 제 노트북에서 직접 F:\가 아닌 "F:\f"로 종료되었습니다.하지만 저는 그것들을 수동으로 자르고 붙일 수 있었습니다.Git는 그 후에도 여전히 새로운 장소에서 일했습니다.

그런 다음 랩톱의 파일을 몇 가지 변경하고 커밋한 다음 바탕 화면으로 밀어 넣었습니다.위에서 언급한 git config 명령을 실행하기 전까지는 작동하지 않았습니다.

Windows PowerShell 내에서 두 컴퓨터 모두에서 이 모든 명령을 실행했습니다.

업데이트: 일부 경우에는 변경을 추진하는 데 문제가 있었습니다.마지막으로 컴퓨터에서 다음을 실행하여 변경 내용을 끌어오기 시작했습니다. 최신 커밋을 끌어오기를 원합니다.

git pull --all --prune

원격 컴퓨터에서 밀어넣는 보고서/디렉토리에 cd를 넣고 입력합니다.

$ git config core.bare true

이미 기존 리포지토리가 있으므로 실행

git config --bool core.bare true

원격 저장소에 있으면 충분할 것입니다.

core.bare 설명서에서

true(예: = true)이면 저장소는 연결된 작업 디렉터리가 없는 맨 상태로 간주됩니다.이 경우 git-add 또는 git-merge와 같이 작업 디렉터리가 필요한 여러 명령이 비활성화됩니다.

이 설정은 리포지토리를 만들 때 git-clone 또는 git-init을 통해 자동으로 추측됩니다.기본적으로 "/.git"로 끝나는 리포지토리는 비어 있지 않은 것으로 간주되며(예: = false), 다른 모든 리포지토리는 비어 있는 것으로 간주됩니다(예: = true).

TLDR

  1. & again: 다시당누르기고:git pull &&& git push.
  2. 아직도 문제야?분기로 : 다른분에푸시기:git push origin master:foo원격 repo에서 병합합니다.
  3. 또는 다음을 추가하여 푸시를 강제로 수행합니다.-f(denyCurrentBranch무시해야 함).

기본적으로 이 오류는 리포지토리가 원격 코드로 최신 상태가 아님을 의미합니다(인덱스 및 작업 트리가 사용자가 푸시한 것과 일치하지 않음).

보통 당신은 해야 합니다.pull 사항을 하고 가먼최변사항을받고경의근장저받▁first고▁the을항사▁andpush다시 한 번

도움이 되지 않는 경우 다른 지점으로 이동합니다. 예:

git push origin master:foo

그런 다음 원격 리포지토리의 이 분기를 마스터와 다시 병합합니다.

일부 과거 커밋을 의도적으로 변경한 경우git rebase 사항으로 , " 고리당신당를변로무고시하으다항그것니싶, "입아당은추로강", "을신가푸요시함써으고하를마도은의신사경다▁▁to▁adding"를 추가하여 강제로 밀어넣기를 입니다.-f/--forceparameter (당신이 하지 입니다.rebase) 안 receive.denyCurrentBranchignore다음을 통해 Git 메시지에서 제안하는 원격 위치:

git config receive.denyCurrentBranch ignore

다른 답변에서 언급한 처럼 체크아웃된 분기에는 푸시할 수 없습니다.거기서부터 시작하죠.

원격 서버에서 원격 저장소를 임시 분기로 체크아웃합니다.

git checkout -b temp

이제 로컬 저장소에서 마스터 분기로 이동할 수 있습니다.

git push

하지만 이것은 영구적인 해결책이 아닙니다.미래의 추진은 같은 문제를 가져올 것입니다.이 문제를 완전히 해결하려면 원격 저장소를 기본 저장소로 전환해야 합니다.원격 서버에서 다음을 입력합니다.

git config core.bare true

이제 원격으로 문제없이 푸시할 수 있습니다.

나에 를원저생다성을 합니다.--bare다음과 같은 옵션:

git init --bare

원격 레포가 푸시하려는 분기에 있을 수 있습니다.원격 컴퓨터에서 다른 분기를 체크아웃할 수 있습니다.저는 이 오류가 사라졌기 때문에 이 작업을 수행했습니다. 그리고 저는 성공을 저의 원격 레포에 밀어넣었습니다.github.com 대신 ssh를 사용하여 내 서버를 연결합니다.

Git repo가 처음에는 non-bare repo로, 잠시 후에는 bare repo로 두 번 (실수로) 초기화되었기 때문에 이 오류가 발생했습니다..git 폴더가 남아 있기 때문에 git는 저장소가 비어 있지 않다고 가정합니다..git 폴더와 작업 디렉터리 데이터를 제거하여 문제를 해결했습니다.

저한테는 효과가 있어요.

  1. git config --global receive.denyCurrentBranch updateInstead

  2. git push origin master

동일한 문제가 발생하여 다음 작업을 수행하려고 합니다.

  1. gitlab 서버(개인 시스템이 아닌 원격 서버 시스템)에 SSH하여 [core]: repo/.git/config에서 bare 값이 거짓임을 발견했습니다.

enter image description here

vim 구성하고 true로 편집합니다. 이제 괜찮아요.제가 마스터할 수 있습니다.

프로그리트를 읽다가 장난을 치다가 이런 오류가 발생했습니다.로컬 저장소를 만든 다음 같은 파일 시스템의 다른 저장소로 가져와서 편집하고 푸시를 시도했습니다.NowhereMan의 답변을 읽은 후, 빠른 해결책은 "원격" 디렉토리로 이동하여 다른 커밋을 임시로 체크아웃하고 변경한 디렉토리에서 푸시한 다음 다시 돌아가서 헤드를 마스터에 두는 것이었습니다.

다른 게시물의 답변에서 이 문제를 설명합니다.제가 보기에 더 나은 방법은 다음과 같습니다.

  1. 원격 서버에 있는 리포지토리의 경우:git branch -b work,work원격 서버를 위해 특별히 작동하는 분기입니다.
  2. 로컬 커밋을 원격 서버 및 로컬 지점 이름으로 푸시(dev)과(와) 달라야 합니다.work혼란을 방지하기 위해, 이제 다음에 대한 오류가 표시되지 않습니다.git push origin dev.
  3. 병합dev로.work원격 서버에 있습니다. git merge.

언급URL : https://stackoverflow.com/questions/11117823/git-push-error-refusing-to-update-checked-out-branch

반응형