programing

Git 푸시 오류 '[원격 거부] 마스터 -> 마스터 (지점은 현재 체크아웃되었습니다)'

testmans 2023. 4. 25. 22:01
반응형

Git 푸시 오류 '[원격 거부] 마스터 -> 마스터 (지점은 현재 체크아웃되었습니다)'

어제 Git 저장소를 내 컴퓨터 중 하나에서 다른 컴퓨터로 복제하는 방법에 대한 질문을 올렸습니다. 다른 컴퓨터에서 'git 복제'하려면 어떻게 해야 합니까?

이제 소스(192.168.1.2)에서 대상(192.168.1.1)으로 Git 저장소를 성공적으로 복제할 수 있습니다.

하지만 제가 파일을 편집했을 때,git commit -a -m "test"그리고 a입니다.git push대상(192.168.1.1)에서 다음과 같은 오류가 발생합니다예: 192.168.1.1).

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

저는 두 가지 버전의 Git을 사용하고 있습니다(리모컨에서 1.7, 로컬 컴퓨터에서 1.5).그게 가능한 이유인가요?

에러 메시지입니다.error: refusing to update checked out branch: refs/heads/master원격 리포지토리에서 내보내며, 이는 현재 작업 디렉터리에서 체크아웃된 코드가 다른 원격 비로그룹 저장소에 코드를 푸시하려는 것을 의미합니다.이 문제를 피하는 가장 좋은 방법은 맨 리포지토리로만 푸시하는 것입니다. 맨 리포지토리에서는 이 문제가 발생할 수 없습니다.

원격 리포지토리를 기본 리포지토리로 변환하기만 하면 됩니다(기본 리포지토리에는 작업 복사본이 없으며 폴더에는 실제 리포지토리 데이터만 포함됨).

원격 리포지토리 폴더에서 다음 명령을 실행합니다.

git config --bool core.bare true

그런 다음 이 파일을 지우다, 지우다, 지우다, 지우다를 제외한 모든 파일을 지웁니다..git이겁니다.그리고 나서 여러분은 이 공연을 할 수 있을 거예요.git push이겁니다.

Git을 배우는 동안 똑같은 오류가 발생했습니다.Git을 처음 접하는 사람을 위한 답이 아닌 것이 분명합니다!

나는 그 생각을 전달하기 위해 비전문 용어를 사용할 것입니다.어쨌든 두 개의 저장소가 있습니다. 하나는 처음 만든 원본 저장소이고 다른 하나는 방금 만든 작업 저장소입니다.

지금 저장소에서 작업하다를 사용하고 있습니다.master그런데 원래 저장소에서같은 저장소로 '로그인'을 하게 됩니다.master원본에"로그인"했기 때문에 Git은 원본 작업을 하다가 일을 망칠까 봐 걱정합니다.이제 당신이 원본에 "로그인"했기 때문에, Git은 당신이 원본을 작업하고 일을 망칠지도 모르기 때문에 당신이 망칠까 봐 두려워합니다.그래서 다시 원래 저장소로 이렇게 해야 요.git checkout someotherbranch이제 문제없이 밀고 나갈 수 있게 되었습니다

오류 메시지는 무슨 일이 일어났는지 설명합니다.최신 버전의 Git은 분기가 체크아웃되면 푸시를 통해 분기를 업데이트하지 않습니다.

비어 있지 않은 두 저장소 간에 작업하는 가장 쉬운 방법은 다음 중 하나입니다.

  1. 항상 풀(또는 가져오기 및 병합)을 통해 리포지토리를 업데이트하거나, 필요한 경우 다음을 수행합니다.

  2. 별도의 분기(가져오기 분기)로 푸시한 다음 해당 분기를 원격 시스템의 마스터 분기로 병합하면 됩니다.

이러한 제한의 이유는 푸시 작업이 원격 Git 저장소에서만 작동하며 인덱스 및 작업 트리에 액세스할 수 없기 때문입니다.따라서 허용된 경우 체크아웃된 분기를 누르면 이 분기가 변경됩니다. HEAD 원격 저장소의 인덱스 및 작업 트리와 일치하지 않습니다.

이렇게 하면 푸시된 모든 변경 사항을 취소하는 변경 사항을 실수로 커밋하기 쉽고 커밋되지 않은 로컬 변경 사항과 새로운 변경 사항 간의 차이를 구별하기가 매우 어렵습니다.HEAD밀어서 생긴 지수와 워킹 트리를말합니다.HEAD요.

요약

체크아웃된 리포지토리 분기로 푸시할 수 없습니다. 그러면 해당 리포지토리의 사용자와 문제가 발생하여 데이터 및 기록이 손실될 가능성이 높기 때문입니다.그러나 동일한 리포지토리의 다른 분기에 푸시할 수 있습니다.

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

필요에 따라 여러 가지 솔루션이 있습니다.

해결책 1: 베어 저장소를 사용합니다.

제안대로, 한 시스템에 작업 디렉토리가 필요 없는 경우, 빈 저장소로 이동할 수 있습니다.저장소를 손상시키지 않으려면 다음과 같이 복제하면 됩니다.

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

이제 원하는 모든 것을 이전과 같은 주소로 푸시할 수 있습니다.

해결책 2: 체크아웃되지 않은 지점에 푸시합니다.

하지만 리모컨에서 코드를 확인해야 할 이 코드를 확인하세요.<remote>그런 다음 특수한 나뭇가지로 밀면 됩니다예를 들어, 여러분의 저장소에서 리모컨으로 전화를 걸었다고 해 보겠습니다.origin그럼 그렇게 하셔도 됩니다.

machine2$ git push origin master:master+machine2

'합치자'에 있을 때 합쳐야 돼요.origin다음을 수행합니다.

machine1$ git merge master+machine2

문제의 부검입니다.

분기가 체크아웃되면 커밋은 현재 분기의 헤드를 부모로 하는 새 커밋을 추가하고 해당 분기의 헤드를 새 커밋으로 이동합니다.

그렇게

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이겁니다. 저장소가 "체크아웃"되어 있더라도 git 저장소를 푸시할 수 있도록 항목을 추가합니다.

[receive]
denyCurrentBranch = warn

아니면요?

[receive]
denyCurrentBranch = false

첫 번째는 분기를 망칠 가능성을 경고하면서 밀어넣기를 허용하고, 두 번째는 조용히 허용합니다.

편집용이 아닌 코드를 서버에 "배포"하는 데 사용할 수 있습니다.이 방법은 최선의 방법은 아니지만 코드를 신속하게 배포하는 방법입니다.

git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

서버 저장소에서 이 기능을 사용하면 추적되지 않은 덮어쓰기가 발생하지 않을 경우 작업 트리도 업데이트됩니다.

VonC가 댓글로 언급한 Git 2.3에 추가 되었습니다.

Git 2.3을 컴파일하여 사용해 보았습니다.사용 예:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

출력은 다음과 같습니다.

a
b

예, 아, 아는데요.b밀렸어요!

원격 상자에 사용 가능한 저장소가 있다는 생각은 좋지만, 더미 분기 대신 다음을 사용하고 싶습니다.

git checkout --detach

이것은 Git의 매우 새로운 기능인 것 같습니다 - 저는 Git 버전 1.7.7.4를 사용하고 있습니다.

저도 같은 문제가 있었어요.저는 Git push를 사용하여 코드를 서버로 이동합니다.서버 쪽에서는 절대 코드를 변경하지 않기 때문에 안전합니다.

저장소에서 다음을 입력하려고 합니다.

git config receive.denyCurrentBranch ignore

이렇게 하면 작업 중인 리포지토리를 변경할 수 있습니다.

Git 푸시를 실행한 후 원격 시스템으로 이동하여 다음과 같이 입력합니다.

git checkout -f

이렇게 하면 푸시한 변경 내용이 원격 시스템의 작업 복사본에 반영됩니다.

푸시 중인 작업 복사본에서 변경 사항을 적용하는 경우 이 작업이 항상 안전한 것은 아닙니다.

서버 리포지토리를 재생성하고 로컬 지점 마스터에서 서버 마스터로 푸시할 수 있습니다.

원격 서버에서 다음을 수행합니다.

mkdir myrepo.git
cd myrepo.git
git init --bare

로컬 지점에서 다음을 수행합니다.

git push origin master:master

이 문제의 원인은 다음과 같습니다.

이런 일은 당신이 작은 프로그램을 만들러 갈 때 일어납니다.이미 작동하던 것을 바꾸려고 합니다. 따라서 영구적인 실행 불가능성의 3단계 주문을 던집니다.

machine1:~/proj1> git init

추가/커밋을 시작합니다.하지만 프로젝트가 점점 더 복잡해지기 시작하고 다른 컴퓨터(예: 가정용 PC 또는 랩톱)에서 작업을 수행하려고 하면 다음과 같은 작업을 수행할 수 있습니다.

machine2:~> git clone ssh://machine1/~/proj1

복제되고 모든 것이 좋아 보이므로 machine2에서 코드를 작성합니다.

그리고... 머신2에서 커밋을 푸시하려고 하면 제목에 경고 메시지가 나타납니다.

이 메시지의 이유는 당신이 꺼낸 git repo가 machine1의 그 폴더에만 사용되도록 되어있었기 때문입니다.문제 없이 복제할 수 있지만 밀어넣으면 문제가 발생할 수 있습니다.두 개의 다른 위치에서 코드를 "적절하게" 관리하는 방법은 다음과 같이 "나급" 응답을 사용하는 것입니다.베어 레포는 작업이 수행되도록 설계된 것이 아니라 여러 소스의 커밋을 조정하기 위한 것입니다.따라서 최상위 등급의 답변에서 .git 폴더를 제외한 모든 파일/폴더를 삭제할 것을 권장합니다.git config --bool core.bare true요.

최상위 등급의 답변을 명확히 합니다.이 답변에 대한 많은 코멘트는 "machine1에서 .git이 아닌 파일을 삭제하지 않았으며 machine2에서 계속 커밋할 수 있었다"와 같은 내용을 담고 있습니다.맞아요.그러나 이제 이러한 다른 파일들은 git repo에서 완전히 "분리"되었습니다.가서 해 보세요git status그러면 이런 걸 볼 수 있을 거예요.이 작업은 작업 트리에서 실행해야 합니다."따라서 파일을 삭제하라는 제안은 machine2의 커밋이 작동하도록 하는 것이 아니라 git이 여전히 파일을 추적하고 있다고 착각하지 않도록 하기 위한 것입니다.하지만 여전히 machine1에서 파일을 작업하려면 파일을 삭제하는 것이 문제가 되지 않습니까?

그래서, 당신은 정말로 무엇을 해야 할까요?

여전히 머신1과 머신2에서 얼마나 작업할 것인지에 따라 달라집니다.

machine1에서 개발을 완료하고 모든 개발을 machine2로 옮겼다면 다음과 같습니다.최고 등급의 답변이 제안하는 대로만 하면 됩니다.git config --bool core.bare true추적되지 않고 혼란을 일으킬 수 있으므로 선택적으로 .filer를 제외한 모든 파일/파일을 해당 폴더에서 삭제합니다.

machine2에 대한 작업이 일회성일 뿐이고, 거기서 개발을 계속할 필요가 없다면...그런 다음 다시 작성할 필요가 없습니다. 머신*1*의 파일 위에 있는 머신*2*의 파일을 ftp/rsync/scp/etc.에서 커밋/삭제하고 머신*1*에서 파일을 삭제하십시오.다른 사람들은 지사를 만들자고 제안했지만, 한 번 개발한 것을 다른 기계와 병합하려면 좀 복잡하다고 생각합니다.

machine1과 machine2 모두에서 개발을 계속해야 하는 경우입니다.제대로 세팅해야 돼요repo를 bare로 변환한 다음 machine1에서 해당 repo의 복제본을 만들어야 합니다.아마도 가장 빠른 방법은 하는 것입니다.

machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1

매우 중요: repo 위치를 proj1에서 proj1.git으로 옮겼기 때문에 machine2의 .git/config 파일에서 업데이트해야 합니다.그런 다음 machine2에서 변경 사항을 커밋할 수 있습니다.마지막으로, 작업 트리에서 멀리 떨어진 중앙 위치에 보관하려고 합니다(즉, 'proj1.git'을 'proj1'과 같은 상위 폴더에 넣지 마십시오).저도 똑같이 하라고 조언하지만, 위의 단계를 가능한 한 단순하게 유지하고자 했습니다.

몇 가지 설정 단계만 거치면 다음과 같은 단일 라이너를 사용하여 웹 사이트에 변경 사항을 쉽게 배포할 수 있습니다.

git push production

원격 서버에 로그인하여 풀(pull) 작업을 수행할 필요가 없습니다.프로덕션 체크 아웃을 업무 부문으로 사용하지 않는 것이 가장 효과적입니다. (OP는 약간 다른 맥락에서 작동했으며, @Robert Gould의 솔루션이 이를 잘 해결했다고 생각합니다.이 솔루션은 원격 서버에 배포하는 데 더 적합합니다.)

먼저 서버의 웹루트 외부에 있는 위치에 빈 저장소를 설정해야 합니다.

mkdir mywebsite.git
cd mywebsite.git
git init --bare

그런 다음 파일을 만들어 보세요.hooks/post-receive다음을 참조하십시오

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

그리고 파일을 실행 가능한 파일로 만듭니다.

chmod +x hooks/post-receive

로컬 머신에 있습니다.

git remote add production git@myserver.com:mywebsite.git
git push production +master:refs/heads/master

그럼! 앞으로는 이렇게 쓸 수 있어요.git push production네, 그렇습니다!

이 솔루션에 대한 공적은 http://sebduggan.com/blog/deploy-your-website-changes-using-git/에 있습니다.무슨 일이 일어나고 있는지 자세히 알아보려면 여기를 보세요.

기본 리포지토리로만 푸시해야 합니다.기본 리포지토리는 체크아웃된 분기가 없는 리포지토리입니다.빈 리포지토리 디렉터리에 CD를 저장해야 하는 경우 .git 디렉터리의 내용만 볼 수 있습니다.

여러분도 확인해보십시오..git/config이겁니다.

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[receive]
    denyCurrentBranch = updateInstead

만약 그렇다면요?core. barefalse 입니다. true:false abouta. true로 설정할 수 있습니다.

$ git config core.bare true

로컬에서 리모트로 푸시할 때 다음과 같이 됩니다.

git push remote_repo   // suppose the destination repo is remote_repo

성공할 것입니다. remote_repo에서 git 버전을 확인할 수 있습니다.

$ git log -1
commit 0623b1b900ef7331b9184722a5381bbdd2d935ba
Author: aircraft < aircraft_xxx@126.com>
Date:   Thu May 17 21:54:37 2018 +0800

이제 "git"을 사용할 수 없습니다.

$ git status
fatal: This operation must be run in a work tree

이렇게 설정해야 합니다.bare.bare거짓으로 돌아가죠

$ git config core.bare false

세 가지 옵션이 있습니다.

  1. 당겼다가 다시 밉니다.

    git pull; git push
    
  2. 다른 분기에 밀어 넣습니다.

    git push origin master:foo
    

    원격에서 할 수 있습니다(어느 쪽이든 상관없습니다.git또는 pull-request)를 선택합니다.

    git merge foo
    
  3. 예상적으로 커밋을 변경한 경우가 아니면 권장하지 않음).rebase 다음을 수행합니다.

    git push origin master -f
    

    그래도 거부되면 사용하지 않도록 설정합니다.denyCurrentBranch 원격 저장소에 있습니다.

    git config receive.denyCurrentBranch ignore
    

실제로 리모컨을 체크 아웃되지 않은 분기로 설정하면 충분합니다.다른 지점에서 리모컨을 체크아웃한 후 를 누를 수 있습니다.

안드로이드 폰과 노트북의 저장소를 동기화하기 위해 Git을 사용하는 것과 같은 문제가 있었습니다.제 해결책은 @CharlesBailey가 제안한 것처럼 밀어내기 대신 당기는 것이었습니다.

git push origin master@hap497이 저장소의 non-bare 체크아웃 + work-copy를 눌렀을 때와 동일한 오류 메시지로 Android 저장소에서 작업이 실패합니다.

git pull droid master노트북 저장소와 작업 복사본에 저장해야 합니다.물론 이런 것도 미리 실행해 봐야 합니다.git remote add droid /media/KINGSTON4GB/notes_repo/요.

이전 버전의 Git은 비어 저장소의 현재 체크아웃된 분기로 푸시하는 데 사용됩니다.

이것은 허용하기에 매우 혼란스러운 일이었죠.그래서 그들은 여러분이 보는 경고 메시지를 추가했는데, 이것 또한 매우 혼란스럽습니다.

첫 번째 저장소가 서버 역할만 하는 경우 다른 답변에서 권장하는 대로 해당 저장소를 기본 저장소로 변환하고 작업을 완료합니다.

그러나 둘 다 사용 중인 두 리포지토리 간에 공유 분기가 있어야 하는 경우 다음 설정으로 이를 달성할 수 있습니다.

Repo1 - 서버 역할을 하며 개발에도 사용됩니다.

Repo2 - 개발 전용입니다.

다음과 같이 Repo1을 설정합니다.

작업을 공유할 분기를 만듭니다.

git branch shared_branch

또한 다른 사용자가 개인 지점과 장난치는 것을 원치 않으므로, 안전을 위해 shared_branch 이외의 변경 사항을 거부하는 $(REPO).git/hooks/update를 생성해야 합니다.

repo1/.git/hooks  (GIT_DIR!)$ cat update
#!/bin/sh
refname="$1"
oldrev="$2"
newrev="$3"

if [ "${refname}" != "refs/heads/shared_branch" ]
then
   echo "You can only push changes to shared_branch, you cannot push to ${refname}"
   exit 1
fi

이제 repo1에 실제 작업을 수행할 로컬 분기를 만듭니다.

git checkout -b my_work --track shared_branch
Branch my_work set up to track local branch shared_branch.
Switched to a new branch 'my_work'

필요할 수 있습니다.git config --global push.default upstream을을 for for for for를 위해서요.git push)) 。

이제 다음을 사용하여 repo2를 생성할 수 있습니다.

git clone path/to/repo1 repo2 
git checkout shared_branch 

이 시점에서 및 repo2 설정은 모두 repo1 및 repo2에서 밀고 당기는 로컬 분기에서 작동합니다.shared_branch에서는 오류 메시지에 대해 걱정할 필요 없이 또는 repo1에서 작업 디렉토리가 동기화되지 않도록 할 수 .사용하는 일반 워크플로우가 모두 작동해야 합니다.

좋습니다. 일반 원격 저장소를 원하는 경우 추가 분기를 만들어 체크아웃하십시오.체크아웃되지 않은 하나의 분기로 밀어넣고 로컬에서 밀어넣은 후 나중에 현재 활성 상태인 분기와 병합합니다.

예를 들어 원격 서버의 경우 다음과 같습니다.

git branch dev
git checkout dev

로컬 설정에서 다음을 수행합니다.

git push 

원격 서버에서 다음을 수행합니다.

git merge dev

자, 이렇게 해서 어떻게 하는지 한 가지런히 하다 보면 어떻게 되는지 알 수 있어요.bare이겁니다.

워크스테이션과 라이브 사이트가 호스팅된 서버가 있고 이 사이트를 수시로 업데이트하려고 한다고 가정해 보십시오(이는 두 개발자가 맨 중간업자를 통해 작업을 주고받는 상황에도 해당됩니다).

초기화 중입니다.

로컬 컴퓨터에 디렉터리를 만들고, 로컬 컴퓨터에 디렉터리를 만듭니다.cd이겁니다.

# initialization
git init --bare server/.git
git clone server content
git clone server local
  1. 먼저 맨몸으로 요.serverdirectory(directory .directory)를 선택합니다.이 디렉터리는 리포지토리 파일의 컨테이너 역할만 합니다.
  2. 그런 다음 새로 만든 저장소를 복제하십시오.content디렉토리입니다.서버 소프트웨어에서 제공하는 라이브/프로덕션 디렉토리입니다.
  3. 처음 두 개의 디렉토리는 서버에 있고, 세 번째 디렉토리는 워크스테이션의 로컬 디렉토리입니다.

워크플로우입니다.

기본 워크플로우는 다음과 같습니다.

  1. 이렇게 하다를 입력합니다.local디렉토리를 만들고 커밋합니다.마지막으로 서버에 푸시합니다.

    # create crazy stuff
    git commit -av
    git push origin master
    
  2. 자, 그럼 이제 입력해보세요.content디렉토리 및 서버 내용을 업데이트합니다.

    git pull
    
  3. 1-2.1-2를 반복하세요.여기 기기서서content서버에 수 있는 다른 개발자일 수도 있습니다.local이겁니다.

이를 사용하여 원격 업스트림 분기에 푸시하면 다음과 같은 문제가 해결되었습니다.

git push <remote> master:origin/master

원격에서 업스트림 레포에 액세스할 수 없으므로 이 방법은 해당 원격의 최신 변경 사항을 가져올 수 있는 좋은 방법입니다.

다시 뛰어야 했어요git --init기존 BARE 저장소에 저장소가 생성되었습니다..git저장소 트리 내의 디렉토리 - 입력 후 깨달았습니다.git status네 제가 그걸 지웠는데 모든 게 다시 정상으로 돌아갔어요:)네 삭제했고 모든 것이 다시 정상으로 돌아갔습니다. :)

(이 모든 답변은 훌륭하지만, 제 경우 설명대로 완전히 다른 것이었습니다.)

이 질문을 보는 대부분의 사람들은 처음 두 개의 큰 답변에 그칠 것입니다. 하지만 저는 여전히 제 해결책을 제안하고 싶습니다.

설명한 오류가 발생했을 때 Eclipse + EGit 웹 프로젝트를 설정했습니다.저에게 도움이 된 것은 GitHub 앱을 사용하는 것만으로 마법처럼 문제를 해결할 수 있었습니다.EGit은 항상 이러한 압박을 거부하지만 GitHub 데스크톱 앱은 어깨를 으쓱하고 제 변화를 밀어붙일 뿐입니다.다중 로그인 상황을 좀 더 우아하게 처리할 수 있습니다.

제가 찾은 다른 사람들에게 유용할 만한 기사는 5분 안에 Git입니다.

DC에 있는 VDE(Virtual Distributed Ethernet)에 푸시하려는 Git 버전 관리 하에 Xcode 프로젝트가 있었습니다.VDE는 Centos 5를 실행합니다.

제가 Git에 대해 읽은 기사 중 어떤 것도 맨 저장소에 대해 언급하지 않았습니다.SVN 출신이라고 생각했던 걸 시도하기 전까지는 모든 게 아주 간단했어요

원격 저장소를 비어 상태로 만들기 위한 제안이 작동했습니다.더 좋은 것은 Xcode 프로젝트를 Xcode로 복제하는 이었습니다.projectname.git원격 서버에 복사한 다음 마법처럼 작동합니다.다음 단계는 커밋에 대한 오류 없이 Xcode를 푸시하는 것이지만, 지금은 터미널에서 할 수 있습니다.

그러니까...

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git sshusername@remotehost.com:repos/<br/>

Xcode:Xcode에서 커밋한 후 프로젝트에서 변경 사항을 푸시합니다.

cd /xcode-project-directory<br/>
git push sshusername@remotehost.com:repos/projectname.git<br/>

위의 작업을 보다 부드럽게 수행할 수 있는 방법이 있을 것이라고 확신하지만, 최소한 이 방법은 효과가 있습니다. 것을 확실히 하기 위해, 여기 몇 가지 설명이 있습니다:/xcode-project-directory는 xcode 프로젝트가 저장된 디렉토리입니다.xcode 로로프 프프 your 。아마 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★./Users/Your_Name/Documents/Project_Name. project name은 말 그대로 프로젝트 이름입니다. 그러나 프로젝트 이름을 원하는 대로 지정할 수 있습니다 project name은 말 그대로 프로젝트 이름이지만 원하는 이름을 모두 사용할 수 있습니다.Git 、 、 git 、 럴 、 git 、 럴 럴 、 럴 、 럴 git 。

scp를 사용하려면 SSH 액세스가 허용된 원격 서버에 사용자 계정이 있어야 합니다.자신의 서버를 실행하는 모든 사용자는 이 기능을 사용할 수 있습니다.공유 호스팅 등을 사용하는 경우 운이 없을 수 있습니다.

remotehost.com원격 호스트의 이름입니다.IP 주소를 쉽게 사용할 수 있습니다.좀 더 알기 쉽게 하기 위해 SSH 키가 있는 원격 호스트에서 Gitosis를 사용하므로, 누를 때 암호를 입력하라는 메시지가 표시되지 않습니다.Hosting Git Repositorys, Easy(그리고 안전한) Way(Git 저장소 호스팅) 기사에서는 이러한 모든 설정 방법을 설명합니다.

가장 좋은 방법은 다음과 같습니다.

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

이렇게 하면 리포지토리가 복제되지만 작업 복사본은 생성되지 않습니다..../remote. 리모콘을 보시면 하나의 디렉토리가 생성되어 있습니다currentrepo.git아마 그게 당신이 원하는 거겠죠

그런 다음 로컬 Git 저장소에서 다음을 수행합니다.

git remote add remoterepo ..../remote/currentrepo.git

변경한 후에는 다음을 수행할 수 있습니다.

git push remoterepo master

저는 방금 Heroku의 배포 git 저장소에서 이 문제에 부딪혔습니다.

왜 Heroku가 bare가 아닌 저장소를 가지고 있는지 알 수 없지만, 해결 방법으로는 원격 저장소를 재설정하고 다시 업로드할 수 있었습니다.

공동 작업을 위한 유일한 git 저장소로 Heroku의 저장소 복사본을 사용해서는 안 됩니다. 그러나 만약을 위해, Heroku가 아닌 다른 곳에 안전하게 저장된 저장소의 전체 복사본을 가지고 있는 것이 확실하다면 이 작업을 수행하지 마십시오. 재설정을 수행하면 리포지토리 내용이 삭제됩니다.

재설정하려면:

  1. Heroku 도구 벨트(명령줄 클라이언트 포함)를 설치합니다(아직 설치하지 않은 경우).
  2. heroku-repo 플러그인이 설치되어 있지 않은 경우 설치합니다.

    heroku plugins:install https://github.com/heroku/heroku-repo.git
    
  3. 재설정을 수행합니다. 그러면 리포지토리가 삭제되고 비어 있는 새 리포지토리가 생성됩니다.

    heroku repo:reset
    
  4. 평소처럼 Heroku 리모컨을 누르면 모든 것이 다시 업로드됩니다.

빈(나눔) 저장소를 만든 후에는 원격 서버에서 구성 파일을 변경해야 합니다.

root@development:/home/git/repository/my-project# cat config 

거기서 보게 될 겁니다

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true

bary to false to true로 만들고 logallrefupdates = true를 제거했습니다(사용 여부는 확실하지 않습니다).

로.

[core]
repositoryformatversion = 0
filemode = true
bare = true

다음을 테스트할 수 있습니다.

$ git remote show origin
* remote origin
Fetch URL: my-portal@development:/home/XYZ/repository/XYZ
Push  URL: my-portal@development:/home/XYZ/repository/XYZ
HEAD branch: (unknown)

이 HEAD 분기는 PUSH를 할 수 없는 경우 (알 수 없음) 표시됩니다. 따라서 HEAD 분기가 알 수 없는 경우 베어(bare)를 true로 변경해야 하며 푸시가 성공한 후 다시 사용할 수 있습니다.

git remote show origin

그리고 당신은 보게 될 것입니다

 HEAD branch: master

현재 작동 중인 솔루션은 다음과 같습니다.

원격 설정:

git checkout -b some_tmp_name

켜짐:

git push

원격 설정:

git checkout master
git branch -d some_tmp_name

하지만 이것은 진정한 해결책이 아닙니다. 단지 회피책일 뿐입니다.

혹시나 유용하다고 생각할지 모르니까제게는 Git 서버 권한 문제였습니다.프로젝트를 빌린 곳에서 체크 아웃하고 간단한 파일을 푸시했는데 "Push rejected:오리진/마스터로의 푸시가 거부되었습니다."

50센트를 덧붙이겠습니다. 가장 많이 투표된 답변 https://stackoverflow.com/a/3251126/3455918은 원격 응답을 기본 저장소로 전환하는 것을 제안합니다. 만약 이것이 제가 원하는 것이 아니라면 어떻게 해야 할까요?

결국 원격 시스템에 동일한 코드가 있어야 하지만 .git 림보 어딘가에 바이트 블록만 있으면 안 됩니다.

두 번째 솔루션(이 문서 작성 시점)인 https://stackoverflow.com/a/2933656/3455918이 이 작업을 수행하지만 테스트 후 로컬 컴퓨터에서 푸시하려는 지점을 "해제"하기 위해 원격 시스템의 지점 간에 끊임없이 전환해야 했습니다.

전 이게 효과가 있었어요

지금까지 제게 효과가 있었던 또 다른 솔루션은 제 솔루션이 아닙니다. 첫 번째 솔루션에 대해 코멘트한 사용자 @kxr에게 공적이 돌아옵니다.

원격 시스템의 경우 repo 디렉토리에서 이 명령을 만들어야 합니다.

git config receive.denyCurrentBranch updateInstead

이 작업을 마치면 끝!

물론 이 솔루션에는 몇 가지 단점이 있을 수 있지만, 로컬 기계 코드를 원격 리포에 동기화하는 간단한 작업이라면 충분할 것입니다.

누군가가 왜 github에서 새로운 repo를 만들고, 당신의 로컬 폴더를 그것에 링크하고, 그것을 시작하는 것이 좋은지 댓글로 설명해주시면 감사하겠습니다.git push origin master네, 그렇습니다.

그러나 원격 서버의 repo에서 동일한 작업을 수행하려고 하면 다음과 같은 오류가 발생합니다.

! [remote rejected] master -> master (branch is currently checked out)

SSH 키를 사용하여 github에 연결하는 경우 SSH 키가 프로파일 설정 아래에 있는지 확인합니다.어떤 이유에서인지, 제 키가 거기서 지워져서 마스터 브랜치로 밀 수 없었어요. SSH 키를 SSH에 추가했습니다.settings/SSH keys

여기에 이미지 설명을 입력하십시오.

기존 키를 보기 위한 명령어입니다.cat ~/.ssh/id_rsa.pub

언급URL : https://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked 입니다.

반응형