자식 푸시 치명적 실패


24

어떻게 든 코드 분기의 전체 디렉토리를 삭제했습니다. 나는 새로운 것을 복제했다. 밀어 넣는 것 외에는 잘 작동했습니다.

~/workspace/wtf (mybranch)]$ git push origin  mybranch 
error: Cannot access URL [my url], return code 22
fatal: git-http-push failed 

그러나 git pull이 작동합니다. 어떻게 고칠 수 있습니까?

git  push 

1
여기 에서이 설명서를 읽고에 대한 요점을 확인하십시오 http.receivepack.
hhh

답변:


33

ssh 대신 https를 사용하여 새로운 사본을 실수로 실수했습니다. 나는 그 이후로 수정하고 커밋했지만 명백한 이유로 밀어 넣을 수 없었습니다.

복구하기 위해 .git / config의 [원격 "origin"] 섹션을

url = https://github.com/AIFDR/riab_core.git

url = git@github.com : AIFDR / riab_core.git

그 후 다시 밀 수있었습니다.


2
다른 프로토콜로 이동할 필요가 없습니다. http를 푸시하려면 아래 답변을 읽으십시오.
바질 A

1
Basil에 동의하면 방화벽 등을 통한 액세스가 제한된 일부 기업 환경에서는 불필요하며 불가능합니다.

... 문제는입니다 git-http-push failed. op가 http 또는 https, -1을 통해 설정하려고합니다.
hhh

14

git만으로 더 빠른 HTTP 푸시-webDAV가 필요하지 않습니다

자식 1.6.6 이후의 새로운 "smart-http"지원. 새로운 방법을 사용하면 전체 파일을 개별 파일이 아닌 한 번에 전송할 수 있습니다.

또한 gitweb을 사용하여 동일한 위치에서 탐색 가능한 URL을 제공 할 수도 있습니다.

참고 : 액세스는 아파치에 의해 제어되므로 각 저장소의 설정에 인증 요구 사항 (htaccess 또는 ldap 등)을 추가 할 수 있습니다.

이 답변은 사용자가 원격 서버를 소유하고 있고 http 지원을 추가 / 수정한다고 가정합니다.

첫 번째 : 아파치 로그를 확인하십시오. 아파치가 git-http-backed cgi 스크립트를 실행하려고 할 때 권한이 거부되었거나 오류를 찾을 수 없습니다.

자식에 HTTP 지원 추가

새 git_support.conf 파일을 만들어 아파치에 포함시키기 만하면됩니다 (httpd.conf에 include 문 추가)

#
#  Basic setup for git-http-backend
#

SetEnv GIT_PROJECT_ROOT /opt/git_repos
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER  #IMportant !!! This could be your problem if missing

<Directory /opt/git>  # both http_backend and gitweb should be somewhere under here
        AllowOverride None
        Options +ExecCGI -Includes  #Important! Lets apache execute the script!
        Order allow,deny
        Allow from all
</Directory>

# This pattern matches git operations and passes them to http-backend
ScriptAliasMatch \
        "(?x)^/git/(.*/(HEAD | \
                        info/refs | \
                        objects/(info/[^/]+ | \
                                 [0-9a-f]{2}/[0-9a-f]{38} | \
                                 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
                        git-(upload|receive)-pack))$" \
        /opt/git/libexec/git-core/git-http-backend/$1

# Anything not matched above goes to displayable gitweb interface
ScriptAlias /git /opt/git/cgi-bin/gitweb.cgi/

결과는 밀거나 당기는 기능입니다.

me@machine /tmp/eddies $ git pull
Already up-to-date.

me@machine /tmp/eddies $ touch changedFile

me@machine /tmp/eddies $ git add .

me@machine /tmp/eddies $ git commit -am"commiting change"
[master ca7f6ed] commiting change
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 changedFile

me@machine /tmp/eddies $ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 239 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To http://mysecretdomain.com/git/eddies
   0f626a9..ca7f6ed  master -> master

온라인에서 이러한 변경 사항을 찾아 볼 수 있습니다. gitweb은 탐색 가능한 인터페이스를 제공합니다

출처 : http://repo.or.cz/w/alt-git.git?a=blob_plain;f=gitweb/README


7 번 줄에 사용자에 대한 중요 줄을 실행하면 "SetEnv takes 1-2 arguments, an environment variable name and optional value to pass to CGI."왜됩니까?
hhh

값이 비어 있다고 생각하므로 setenv는 0 개의 인수 만 봅니다. 아파치는 리디렉션 규칙을 사용하기 때문에 REMOTE_USER가 비어있을 수 있으므로 REDIRECT_RMEOTE_USER를 가져옵니다. RMEOTE_USER가 이미 정의 된 경우 (또는 REDIRECT 사용자가 비어있는 경우) 지정을 선택적으로 지정할 수 있어야합니다. httpd.apache.org/docs/2.0/mod/mod_setenvif.html#setenvif

7

http를 통해 " git push "를 활성화하려면 웹 서버에서 WebDAV를 활성화해야합니다. Apache Webserver에 대해이를 수행하려면 구성 파일을 편집하십시오.

vim /etc/httpd/conf/httpd.conf

그런 다음 다음으로 시작하는 줄을 검색하십시오.

<Directory "/var/www/html">

바로 다음 줄을 추가하십시오.

Dav On

주석 처리되지 않은 httpd.conf에도 다음 줄이 있어야합니다.

LoadModule dav_fs_module modules/mod_dav_fs.so

그 후에는 준비되었습니다. 다음을 사용하여 Apache 웹 서버를 다시 시작하십시오.

service httpd restart

또한 다음을 사용하여 서버의 모든 git 저장소 파일을 pache : apache 사용자 및 그룹이 쓸 수 있도록하십시오.

chown -R apache:apache /var/www/html/your_git_repository

그렇지 않으면, 올바른 권한을 설정하지 않으면 "git push"를 수행 할 때 "PUT 오류 : curl result = 22, HTTP code = 403"이 발생합니다.

이제 클라이언트 시스템에서 "git push"를 수행하면 모두 작동합니다.


참고 : 사용자가이 장애물을 지나쳤지만 apcahe 로그에서 receive-pack stackoverflow.com/questions/792611/…

2
이것은 작동하지만 DAV는 필요 하지 않으며 실제로 smart-http보다 훨씬 느리게 수행됩니다.

4

HTTP를 통해 복제 한 저장소를 푸시 할 수 없습니다. URL을 a ssh://또는 git://유형 URL 로 업데이트해야합니다 .


동일한 클론 명령을 사용했습니다. 그것은 내가 잘못 삭제하기 전까지는 효과가 있었다 ....

무엇을 가지고 git remote -v있습니까?
Mighty Rubber Duck

완전히 사실이 아닙니다. DAV가 활성화되어 있다고 가정하면 리포지토리로 되돌릴 수 있습니다.

6
이것은 올바르지 않습니다. 1.6.6 이후 Git은 아파치 및 git-http-backend를 사용하여 스마트 http 푸시 및 풀을 지원합니다.

3

.git / config 파일의 다음 섹션을 편집하십시오.

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://git.repository.url/repo.git

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://username:password@git.repository.url/repo.git

그런 다음 시도하십시오 git push origin master.

필요에 따라 다른 저장소 URL에 대한 구성 파일의 인증 세부 사항을 편집하고 필요한 분기로 푸시하십시오.


참고 :이 방법을 사용하여 문제를 해결했지만 구성 파일에 암호를 저장하는 것이 잘못 된 것 같아서 암호를 묻는 메시지가 표시 되는대로 남겨두고 그대로 사용할 수있었습니다.
chris

git remote set-url origin ...잘 작동합니다.
막시밀리안 힐스

1

git-http-backend, ldap 인증 구성에서 푸시 작업과 동일한 문제가있었습니다.
마지막으로 해결책을 찾고이 serverfault 질문에서 설명합니다 .

아마도 비슷한 문제를 가진 사람을 도울 것입니다.


0

다른 오류가 있었지만 작동합니다!

나는 설명하려고합니다 :

  • apache2와 webdav로 우분투 서버 설치
  • 자세한 내용 은 http://www.mabishu.com/blog/2011/02/09/setup-a-remote-git-repository-using-http-with-push-support-and-digest-auth/ 를 참조하십시오
  • 클라이언트에서 복제-> 완벽!
  • 무언가를 바꾸다....
  • 푸시-> 실패
  • 서버에서 소유자 변경
  • "PUT 오류 : curl result = 22, HTTP code = 403"오류가 발생했습니다.
  • 이제 git-http-push가 실패했다고 말합니다.
  • 서버 로그 : Could not LOCK /path/to/www/gitproject/refs/heads/master due to a failed precondition (e.g. other locks)
  • 나는 user1520409ist works 의 대답을 사용했습니다 .

그러나 푸시 메시지의 텍스트에서 비밀번호를 숨기는 방법은 무엇입니까?


-1

잘못된 비밀번호를 입력 한 경우에도 발생할 수 있습니다.


나는 그것을 본 적이 없다 : 나는 항상 fatal: Authentication failed먼저 얻는다
Rup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.