git push เสียชีวิตล้มเหลว


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

ฉันทำผิดพลาดในการใช้ https แทน ssh เพื่อทำสำเนาใหม่ ฉันตั้งแต่นั้นทำการแก้ไขและกระทำ แต่ไม่สามารถผลักดันด้วยเหตุผลที่ชัดเจน

ในการกู้คืนฉันได้ง่ายเปลี่ยนส่วน [ระยะไกล "กำเนิด"] ใน. git / config จาก

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

HTTP พุชที่เร็วขึ้นด้วย git เท่านั้น - ไม่จำเป็นต้องใช้ webDAV

รองรับ "smart-http" ใหม่ตั้งแต่ git 1.6.6 วิธีการใหม่นี้อนุญาตให้ส่งทั้งชุดในคราวเดียวและไม่ใช่เป็นไฟล์เดี่ยว ๆ

คุณยังสามารถใช้ gitweb เพื่อจัดทำ URL ที่สามารถเรียกดูได้ในตำแหน่งเดียวกัน

หมายเหตุ: เนื่องจากการเข้าถึงถูกควบคุมโดย apache คุณสามารถเพิ่มข้อกำหนด Auth ใด ๆ (htaccess หรือ ldap ฯลฯ ) ในการตั้งค่าสำหรับแต่ละที่เก็บ

คำตอบนี้จะถือว่าคุณเป็นเจ้าของเซิร์ฟเวอร์ระยะไกลและต้องการเพิ่ม / แก้ไขการสนับสนุน http

FIRST: ตรวจสอบล็อก apache อาจเป็นไปได้ว่าสิทธิ์ถูกปฏิเสธ / ไม่สามารถหาข้อผิดพลาดได้เมื่อ apache พยายามเรียกใช้สคริปต์ cgi git-http- แอ่น

เพิ่มการสนับสนุน HTTP ให้กับคอมไพล์

เพียงแค่สร้างไฟล์ git_support.conf ใหม่และรวมไว้ใน apache (เพิ่มคำสั่ง include ใน httpd.conf)

#
#  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 อาร์กิวเมนต์เท่านั้น เนื่องจาก apache ใช้กฎการเปลี่ยนเส้นทางเป็นไปได้ว่า REMOTE_USER นั้นว่างเปล่าดังนั้นเราจึงคว้า REDIRECT_RMEOTE_USER คุณควรจะสามารถกำหนดให้เป็นตัวเลือกหาก RMEOTE_USER ถูกกำหนดไว้แล้ว (หรือผู้ใช้ REDIRECT ว่างเปล่า) httpd.apache.org/docs/2.0/mod/mod_setenvif.html#setenvif

7

ในการเปิดใช้งาน " git push " บน http คุณต้องเปิดใช้งาน 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 Webserver โดยใช้:

service httpd restart

ตรวจสอบให้แน่ใจด้วยว่าทำให้ไฟล์ที่เก็บ git ทั้งหมดบนเซิร์ฟเวอร์สามารถเขียนได้โดย pache: ผู้ใช้ apache และกลุ่มโดยใช้:

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

มิฉะนั้นความล้มเหลวในการตั้งค่าสิทธิ์ที่ถูกต้องจะส่งผลให้ "ข้อผิดพลาด PUT: curl result = 22, รหัส HTTP = 403" เมื่อดำเนินการ "git push"

ตอนนี้เพียงแค่ "git push" จากเครื่องไคลเอนต์ของคุณและทุกอย่างจะทำงานได้


หมายเหตุหากผู้ใช้ผ่านอุปสรรค์นี้ แต่ดูข้อผิดพลาดใน apcahe บันทึกเกี่ยวกับการรับแพ็ค stackoverflow.com/questions/792611/ …

2
สิ่งนี้จะได้ผล แต่ไม่จำเป็นต้องใช้DAV และทำงานได้ช้ากว่า smart-http มาก

4

คุณไม่สามารถผลักดันที่เก็บที่คุณโคลนผ่าน HTTP คุณต้องอัปเดต URL ssh://เป็นgit://URL ประเภทใดประเภทหนึ่ง


ฉันใช้คำสั่งโคลนเดียวกัน มันทำงานมาก่อนจนกระทั่งฉันทำการลบผิด ....

คุณมีgit remote -vอะไรกับ
เป็ดยางอันยิ่งใหญ่

ไม่จริงทั้งหมด คุณสามารถผลักดันกลับไปยังที่เก็บโดยสมมติว่าเปิดใช้งาน DAV

6
สิ่งนี้ไม่ถูกต้อง Git ตั้งแต่ 1.6.6 รองรับการกดและดึง http อัจฉริยะโดยใช้ apache และ git-http-backend

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 ...ทำงานได้เช่นกัน
Maximilian Hils


0

ยิ่งใหญ่

ฉันมีข้อผิดพลาดอื่น ๆ แต่ใช้งานได้!

ฉันพยายามอธิบาย:

  • ติดตั้งเซิร์ฟเวอร์ ubuntu พร้อม apache2 และ webdav
  • ดูที่http://www.mabishu.com/blog/2011/02/09/setup-a-remote-git-repository-using-http-with-push-support-and-digest-auth/สำหรับรายละเอียด
  • โคลนบนไคลเอนต์ -> สมบูรณ์แบบ!
  • เปลี่ยนบางสิ่ง
  • push -> ล้มเหลว
  • เปลี่ยนเจ้าของบนเซิร์ฟเวอร์
  • ข้อผิดพลาด "ข้อผิดพลาด PUT: curl result = 22, รหัส HTTP = 403" หายไป ..
  • ตอนนี้บอกว่า git-http-push ล้มเหลวเท่านั้น
  • serverlog: Could not LOCK /path/to/www/gitproject/refs/heads/master due to a failed precondition (e.g. other locks)
  • ฉันใช้คำตอบจากuser1520409งาน ist

แต่จะซ่อนรหัสผ่านจากข้อความที่ข้อความพุชได้อย่างไร


-1

สิ่งนี้อาจเกิดขึ้นได้หากคุณป้อนรหัสผ่านผิด


ผมไม่เคยเห็นว่าผมเคยได้รับfatal: Authentication failedครั้งแรก
โฟโต้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.