질문:
sshfs를 통해 마운트된 git 저장소가 있는데 다음 오류 메시지와 함께 변경 사항을 커밋할 수 없습니다.
fatal: cannot update the ref 'HEAD': unable to append to '.git/logs/HEAD': Permission denied
가능하니 참고해주세요
cp -a .git/logs/HEAD .git/logs/HEAD.bu
printf foo > .git/logs/HEAD
mv .git/logs/HEAD.bu .git/logs/HEAD
문제없지만
printf foo >> .git/logs/HEAD
또한 "권한이 거부되었습니다"를 표시했습니다.
질문:
내 로컬 컴퓨터에서 원격 저장소에 커밋하려면 어떤 구성을 변경해야 합니까?
내가 시도한 것:
위의 증상을 보면 파일 추가에 문제가 있는 것 같습니다. 내가 찾은SSHFS의 Git 저장소: '.git/logs/HEAD'에 연결할 수 없습니다: 잘못된 인수이는 다음을 가리킨다.https://github.com/libfuse/sshfs/issues/82제안된 문제(약간 다른 오류 메시지 참고)는 를 사용하여 해결할 수 있습니다 writeback_cache=no
. 후자의 소스는 man
다음 경고/해결 방법을 인용하는 페이지를 인용합니다.
CAVEATS / WORKAROUNDS [...] O_APPEND When writeback caching is enabled, SSHFS cannot reliably support the O_APPEND open flag and thus signals an error on open. To enable support for unreliable O_APPEND (which may overwrite data if the file changes on the server at a bad time), mount the file system with -o unreliable_append.
그러나 이 섹션은 내 매뉴얼 페이지에 없습니다.
sshfs -V
SSHFS version 3.7.0
FUSE library version 3.9.1
using FUSE kernel interface version 7.31
fusermount3 version: 3.9.1
쓰기 저장 캐싱 기능을 비활성화하려고 시도한 것을 발견했습니다.실제로 삭제되었습니다(나중에는장애가 있는그리고다시 활성화 한 번 이상앞으로). 그래서 내 생각엔~해야 한다괜찮습니다. 하지만 분명히 (여전히) 문제가 있습니다.
제가 언급해야 할 또 다른 문제는 원격 시스템의 사용자 이름 및 ID가 로컬 시스템의 사용자 이름 및 ID와 일치하지 않으므로 해당 기능을 사용해야 한다는 것입니다 idmap
.
해당 fstab
항목은 다음과 같습니다.
<remote-user>@<remote-machine>: /mnt/ssh/<remote-machine> sshfs _netdev,user,idmap=user,allow_other 0 0
또한 내 /etc/fuse.conf
내용에는
user_allow_other
배경:
답변을 피하려면 다음과 같이 하지 말라고만 말씀해 주세요.
- 나는 Git이 어떻게 작동하는지 알고 있습니다.
- 저장소를 로컬로 복제하고 커밋한 다음 SSH를 통해 원격 저장소로 푸시할 수 있다는 것을 알고 있습니다.
나는 왜 그것을 하지 않는가? - 원격 머신에서만 테스트할 수 있는 코드를 추적하고 있기 때문에 커밋하기 전에 반드시 테스트해보고 싶습니다. 따라서 어느 정도는 피해야 할 "단지" 편의상의 문제입니다.
- 로컬 복사본에서 코드를 편집합니다.
- 로컬 복사본에 대한 변경 사항을 커밋합니다.
- 원격 복제본으로 푸시합니다.
- SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
- 원격 시스템에서 코드를 테스트합니다.
- 다른 분기를 확인하세요(강제 푸시를 허용하려면).
- SSH 세션을 종료합니다(또는 터미널로 [다시] 전환).
- 코드를 편집하세요.
- 로컬 복사본에서 이전 커밋을 수정합니다.
- 원격 복제본으로 강제 푸시합니다.
- SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
- 강제로 밀린 분기를 확인하십시오.
- 만족스러울 때까지 5~11단계(7단계!)를 반복합니다.
대신에 나는 다음을 원한다:
- SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
- 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
- 원격 시스템에서 코드를 테스트합니다.
- 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
- 만족스러울 때까지 3~4단계(2단계!)를 반복합니다.
- SSH 세션을 종료합니다(또는 터미널로 [다시] 전환).
- 로컬 머신의 변경 사항을 원격 복제본에 커밋합니다.
원격 시스템에서 직접 제출하지 않는 이유는 무엇입니까? - 커밋에 서명하고 싶지만 개인 키를 원격 컴퓨터에 위임할 수 없기 때문입니다. 그래서 제가 생각할 수 있는 최선의 선택은 다음과 같습니다.
- SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
- 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
- 원격 시스템에서 코드를 테스트합니다.
- 원격 컴퓨터의 원격 복사본에서 코드를 편집합니다.
- 만족스러울 때까지 3~4단계(2단계!)를 반복합니다.
- 원격 시스템의 원격 복사본에 대한 변경 사항을 커밋합니다.
- 다른 분기를 확인하세요(강제 푸시를 허용하려면).
- SSH 세션을 종료합니다(또는 터미널로 [다시] 전환).
- 원격 복사본에서 가져옵니다.
- 로컬 복사본에서 이전 커밋을 수정(서명)합니다.
- 원격 복제본으로 강제 푸시합니다.
- SSH(또는 스위치 터미널)를 통해 원격 컴퓨터에 연결합니다.
- 강제로 밀린 분기를 확인하십시오.
그래서 한편으로는 이러한 추가 단계를 제거하고 싶습니다(기능 브랜치를 추가할 때 상황이 더 복잡해집니다. 왜냐하면 이러한 브랜치는 두 복제본 모두에서 제대로 확인되고 올바른 추적으로 구성되어야 하기 때문입니다). 왜 "그냥 작동"하지 않는지 이해하고 싶습니다(tm).
고쳐 쓰다:
후속 조치코멘트통과@투칸, 디버그 출력으로 오류를 재현했습니다.
- 디버그 출력을 사용하여 리모컨을 설치합니다.
mount -o sshfs_debug MOUNTPOINT
SSHFS version 3.7.0
executing <ssh> <-x> <-a> <-oClearAllForwardings=yes> <-2> <USER@SERVER> <-s> <sftp>
USER@SERVER's password:
Server version: 3
Extension: versions <2,3,4,5,6>
Extension: [email protected] <1>
Extension: [email protected] <1>
Extension: [email protected] <2>
Extension: [email protected] <2>
Extension: [email protected] <1>
remote_uid = 0
- 다른 터미널에서 마운트된 공유에 액세스합니다.
cd MOUNTPOINT/DIR_WITH_WRITE_PERMISSIONS
[00002] LSTAT
[00002] ATTRS 45bytes (188ms)
- 정기적인 글쓰기 작업 확인:
echo foo > foobar
[00003] LSTAT
[00003] STATUS 38bytes (46ms)
[00004] LSTAT
[00004] STATUS 38bytes (32ms)
[00005] LSTAT
[00005] ATTRS 45bytes (242ms)
[00006] OPENDIR
[00006] HANDLE 29bytes (31ms)
[00007] READDIR
[00008] READDIR
[00007] NAME 668bytes (58ms)
[00009] READDIR
[00010] READDIR
[00008] NAME 483bytes (65ms)
[00011] READDIR
[00012] READDIR
[00009] STATUS 37bytes (27ms)
[00010] STATUS 37bytes (27ms)
[00013] CLOSE
[00014] LSTAT
[00011] STATUS 37bytes (27ms)
[00012] STATUS 37bytes (27ms)
[00013] STATUS 28bytes (26ms)
[00014] STATUS 38bytes (31ms)
[00015] OPEN
[00016] LSTAT
[00015] HANDLE 29bytes (153ms)
[00016] ATTRS 45bytes (158ms)
[00017] FSTAT
[00017] ATTRS 45bytes (29ms)
[00018] WRITE
[00018] STATUS 28bytes (28ms)
[00019] CLOSE
[00019] STATUS 28bytes (28ms)
- 연결하려고 하면 오류가 발생합니다.
echo bar >> foobar
[00020] LSTAT
[00020] STATUS 38bytes (74ms)
[00021] LSTAT
[00021] STATUS 38bytes (57ms)
[00022] LSTAT
[00022] ATTRS 45bytes (52ms)
[00023] OPENDIR
[00023] HANDLE 29bytes (53ms)
[00024] READDIR
[00025] READDIR
[00024] NAME 668bytes (68ms)
[00026] READDIR
[00027] READDIR
[00025] NAME 597bytes (77ms)
[00028] READDIR
[00029] READDIR
[00026] STATUS 37bytes (47ms)
[00030] CLOSE
[00027] STATUS 37bytes (47ms)
[00031] OPEN
[00032] LSTAT
[00028] STATUS 37bytes (47ms)
[00029] STATUS 37bytes (47ms)
[00030] STATUS 28bytes (26ms)
[00031] STATUS 43bytes (28ms)
[00032] ATTRS 45bytes (29ms)
zsh: permission denied: foobar
이것이 내 문제의 근본 원인을 찾는 데 도움이 되기를 바랍니다.
참고: 기준답변통과@devidas(몇 주 동안 필사적으로 관심을 끌고 노력한 후에도 솔루션이 부족함)해당 GitHub 문제에 교차 게시했습니다..
답변1
정말 크고 상세한 질문입니다. 이 문제를 단계별로 해결해 보겠습니다. 오류는 "권한이 거부되었습니다"입니다.
Linux error code
EACCES 13 /* Permission denied */
sshfs 저장소를 검색했을 때 EACCES
파일에 두 개의 인스턴스만 있는 것을 발견했습니다.[sshfs.c][1]
하나는 로컬 컨텍스트의 파일 권한에 관한 것입니다. 당신이 보여준 것.
SSH_FX_PERMISSION_DENIED
다른 것들은 SSH 권한 거부로 인한 오류 입니다 .
제가 가지고 있는 데이터를 토대로 거의 확실하게 말할 수 있습니다. 로컬 컴퓨터에 대한 권한이 있는 경우
사례
printf foo >> .git/logs/HEAD
이는 대신 권한이 거부된 이유를 제공합니다.
printf foo > .git/logs/HEAD
원격 컴퓨터에 대한 권한이 없거나 참조된 O_APPEND
원격 서버가 지원하지 않습니다.117호
strace를 사용하여 확인할 수 있습니다.
그 이유 부분입니다. 이 문제가 해결되는 방법은 귀하의 응답에 따라 다릅니다. 어떤 상황인가요?
더 많은 도움을 드릴 수 있도록 알려주세요.
동의하지 않으시면 자유롭게 댓글을 남겨주세요.