Git 오류 : .git / logs / refs / remotes / origin / master에 추가 할 수 없음 : 권한이 거부되었습니다.


87

해결할 수없는 이상한 문제가 있습니다. 다음은 일어난 일입니다.

github 저장소에 내가 원하지 않는 로그 파일이 있습니다. 다음과 같이 git 히스토리에서 파일을 완전히 제거하는이 스크립트를 찾았습니다.

    #!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0are still
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

물론 나는 먼저 백업을 만든 다음 시도했습니다. 잘 작동하는 것 같았습니다. 그런 다음 git push -f를 수행하고 다음 메시지를 받았습니다.

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.

파일이 GitHub 저장소에서 사라진 것처럼 보이므로 모든 것이 잘 푸시 된 것 같습니다. 다시 푸시를 시도하면 동일한 결과를 얻습니다.

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.
Everything up-to-date

편집하다

$ sudo chgrp {user} .git/logs/refs/remotes/origin/master
$ sudo chown {user} .git/logs/refs/remotes/origin/master
$ git push
Everything up-to-date

감사!

편집하다

어 오. 문제. 나는이 프로젝트에서 밤새 작업을했고 변경 사항을 커밋하러 갔다.

error: Unable to append to .git/logs/refs/heads/master: Permission denied
fatal: cannot update HEAD ref

그래서 나는 :

sudo chown {user} .git/logs/refs/heads/master
sudo chgrp {user} .git/logs/refs/heads/master

커밋을 다시 시도하면 다음을 얻습니다.

error: Unable to append to .git/logs/HEAD: Permission denied
fatal: cannot update HEAD ref

그래서 나는 :

sudo chown {user} .git/logs/HEAD
sudo chgrp {user} .git/logs/HEAD

그런 다음 커밋을 다시 시도합니다.

16 files changed, 499 insertions(+), 284 deletions(-)
create mode 100644 logs/DBerrors.xsl
delete mode 100644 logs/emptyPHPerrors.php
create mode 100644 logs/trimXMLerrors.php
rewrite public/codeCore/Classes/php/DatabaseConnection.php (77%)
create mode 100644 public/codeSite/php/init.php
$ git push
Counting objects: 49, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (27/27), done.
Writing objects: 100% (27/27), 7.72 KiB, done.
Total 27 (delta 15), reused 0 (delta 0)
To git@github.com:IAmCorbin/MooKit.git
59da24e..68b6397  master -> master

만세. 나는 점프하지 http://GitHub.com 및 저장소를 확인하고 찾을 수 어디에 내 최신 커밋은 NO입니다. :: scratch head :: 그래서 나는 다시 밀어 :

Everything up-to-date

음 .. 안 그래요. 나는 전에이 문제가 없었는데 이것이 github에 문제가 될 수 있습니까? 아니면 내 자식 프로젝트에서 뭔가 엉망이 되었습니까?

편집하다

신경 쓰지 마, 나는 간단한 일을했다.

git push origin master

그리고 그것은 잘 밀었습니다.

답변:


216

이것은 로컬에서 루트로 git을 실행하여 origin분기 위치를 추적하는 일부 파일의 소유권을 변경 한 것처럼 보입니다 .

파일 소유권을 수정하면 괜찮습니다.

# run this from the root of the git working tree
sudo chown -R "${USER:-$(id -un)}" .

1
그 명령은 저에게 효과적이었습니다. 클론의 루트에서 실행했습니다. 감사합니다 @CharlesDuffy!
ariestav

4
@ Mr.Stranger, 정상적인 IFS 값과 사용자 이름이있는 경우에만 해당됩니다 (예 : cygwin에서 공백이있는 사용자 이름이 발생할 수 있음). 인용하는 것이 더 안전합니다 : sudo chown -R "$USER" ., 그리고 온전하다고 가정하지 않습니다. :)
Charles Duffy

@ Mr.Stranger, ... 또한 pubs.opengroup.org/onlinepubs/009695399/utilities/…USER의해 보장되지 않으므로을 사용하는 것이 더 안전 할 수 있습니다 "$(id -un)".
Charles Duffy

내 사용자 is not in the sudoers file. This incident will be reported.에게 표시됩니다. 내가 할 수있는 일에 대한 팁이 있습니까? 감사.
giovannipds

1
위의 구문은 매개 변수 확장입니다 . "${var:-default}"변수 값으로 확장 "$var", 않는 그 값이 경우는로 확인, 빈 또는 해제이다 default. 따라서로 확장 "$USER"하거나를 실행하여 생성 된 출력을 확장합니다 id -un.
Charles Duffy

3

정확히 무엇에 대해 불평하는지 집중합시다.

권한 거부 오류 : 참조 'refs / remotes / origin / master'를 업데이트 할 수 없습니다.

재귀 적 모드 / 소유권 변경을 수행하기 전에 해당 파일로 이동하고 잘못된 권한을 수정하십시오.

내가 루트 였을 때 브랜치를 만든 다음 그 브랜치를 내 사용자로 엉망으로 만들려고해서이 문제가 발생했다고 생각합니다.


3
전체 소스 트리를 하나씩 소유 할 것으로 예상되는 사용자 이외의 다른 사람이 소유 한 파일을 수정하는 것이 실제로 개선 된 것입니까?
Charles Duffy

2

제 경우에는 로컬에서 루트 권한으로 파일을 만들고 로컬 권한으로 코드를 원격으로 푸시하려고했습니다. 그래서이 명령을 실행했습니다

$find . -user root

모든 파일이 소유자로 "루트"를 가지고 있는지 확인합니다. 그리고 다음 명령을 사용하여 루트에있는 모든 파일의 소유자를 로컬로 변경했습니다.

$sudo chown parineethat `find . -user root`

그런 다음 내 코드를 로컬에서 원격으로 푸시 할 수있었습니다.


sudo chown parineethat `find . -user root` 신뢰할 수 없습니다-공백이있는 파일 이름에서는 제대로 작동하지 않습니다. 대신 sudo find . -user root -exec chown parineethat {} +. 관련 토론 은 BashPitfalls # 1 을 참조하십시오 .
Charles Duffy

1

이렇게하면 모든 .git 파일과 디렉토리가 재귀 적으로 (루트에서 1000으로) 변경되고 터미널에서 수행 된 모든 변경 사항의 전체 목록이 제공됩니다.

sudo chown -Rc $ UID .git /


0

Git에 대한 소유권을 수정하려고했지만 여전히 작동하지 않습니다.

그러나 다른 이름으로 로컬 브랜치를 생성하고 삭제하여 수정했습니다.

그런 다음 동일한 지점 이름을 다시 확인하고 작동합니다.

TLDR;

`staging / rc '를 체크 아웃 할 수 없습니다.

그래서 나는 staging리모컨이`staging / rc '를 가리키는 대신 사용하여 체크 아웃했습니다 .

그리고 삭제하고 다시 체크 아웃합니다. 하지만 이번에는 staging/rc로컬 브랜치 이름으로 사용합니다.

작동하고 이유를 모르겠습니다.


-16

먼저 root아래와 같은 계정 에서 권한을 부여하십시오

chmod -R 777 foldername

그 후 커밋 명령을 실행하십시오.


7
이것은 매우 위험합니다. "아무도"권한 만 가진 손상된 데몬을 포함하여 시스템의 모든 계정에 파일에 대한 쓰기 권한을 부여합니다. 시스템 데몬은 보안에 민감한 구성 요소에 대해 "nobody"(또는 기타 권한없는 계정)를 사용 합니다. nobody 계정은 손상 되더라도 너무 위험한 작업을 수행 할 수 없기 때문 입니다. 아무도, 심지어 모든 사용자에게 파일에 대한 쓰기 권한을 부여함으로써 필수적인 보안 조치를 쓸모 없게 만듭니다.
Charles Duffy

1
어떤 이유로 파일을 루트가 소유하고 특정 루트가 아닌 사용자가 쓸 수 있도록하려는 경우이를 수행하는 안전한 방법 (표준 관행과 같이 각 사용자가 자신의 그룹이있는 시스템에서)은 다음 chown -R root:user directory과 같습니다. 그런 다음 chmod -R 775 directory(또는 770다른 계정에도 읽기 액세스가 필요하지 않은 경우).
Charles Duffy 2015 년

1
@JasonGlisson, 방대한 보안 허점을 만들어서 만 "작동"하는 것은 고장난 상태를 유지하는 것이 더 나을 것입니다.
Charles Duffy

1
@JasonGlisson, 커뮤니티와 커뮤니티 모두에게 조언을 제공하는 한, 커뮤니티의 구성원으로서 우리가 제공하는 조언의 종류와 질은 다른 누구와 마찬가지로 내 비즈니스이며 보안 분야에서 일하는 사람으로서 , 나는 주제에 대해 논평하기에 좋은 위치에 있습니다. 초기 주석, re : impact를 참조하십시오.
Charles Duffy

1
@JasonGlisson, ... 내 조언이 당신을 위해 작동하지 않는 이유에 대해, 나는 세부 사항을 볼 필요가있을 것입니다. 발생한 오류의 텍스트 기타-의견을 제시하기 위해; 그러나 그 토론의 장소는 여기가 아니라 나쁜 결과를보고하는 답변에 첨부 될 것입니다.
Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.