git đẩy gây tử vong


24

Tôi bằng cách nào đó đã xóa toàn bộ thư mục của chi nhánh mã của tôi. Tôi nhân bản một cái mới. Nó hoạt động tốt, ngoại trừ đẩy.

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

git kéo hoạt động, mặc dù. Làm thế nào tôi có thể sửa chữa nó?

git  push 

1
Xin vui lòng, đọc hướng dẫn này ở đây và chú ý điểm về http.receivepack.
hhh

Câu trả lời:


33

Tôi đã phạm sai lầm khi sử dụng https thay vì ssh cho một bản sao mới. Kể từ đó tôi đã thực hiện sửa đổi và cam kết nhưng không thể thúc đẩy vì lý do rõ ràng.

Để khôi phục, tôi đơn giản thay đổi phần [remote "origin"] trong .git / config từ

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

đến

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

Sau đó, tôi có thể đẩy lại.


2
Không cần phải chuyển sang giao thức khác, hãy đọc câu trả lời của tôi dưới đây nếu bạn muốn chuyển qua http.
Basil A

1
Đồng ý với Basil, điều này là không cần thiết và không thể trong một số môi trường doanh nghiệp bị hạn chế truy cập thông qua tường lửa, v.v.

... vấn đề là ở chỗ git-http-push failed, tôi thấy op đang cố gắng thiết lập mọi thứ qua http hoặc https, -1.
hhh

14

Đẩy HTTP nhanh hơn chỉ với git - không yêu cầu webDAV

Hỗ trợ "smart-http" mới kể từ git 1.6.6. Phương thức mới cho phép toàn bộ gói được truyền cùng một lúc và không phải là các tệp riêng lẻ.

YOu cũng có thể sử dụng gitweb để cung cấp các URL dễ đọc tại cùng một vị trí.

Lưu ý: Vì quyền truy cập được kiểm soát bởi apache, bạn có thể thêm bất kỳ yêu cầu Auth nào (htaccess hoặc ldap, v.v.) vào thiết lập cho mỗi kho lưu trữ.

Câu trả lời này giả định rằng bạn sở hữu máy chủ từ xa và muốn thêm / sửa lỗi hỗ trợ http.

FIRST: Kiểm tra nhật ký apache, có khả năng là quyền bị từ chối / không thể xác định lỗi khi apache cố gắng thực thi các tập lệnh cgi được hỗ trợ bởi git-http.

Thêm hỗ trợ HTTP vào git

Chỉ cần tạo một tệp git_support.conf mới và đưa nó vào apache (thêm câu lệnh bao gồm trong 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/

Kết quả là khả năng đẩy / kéo:

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

Và bạn có thể duyệt những thay đổi trực tuyến .. gitweb cung cấp một giao diện có thể duyệt

Nguồn: http://repo.or.cz/w/alt-git.git?a=blob_plain;f=gitweb/README


Khi tôi chạy dòng QUAN TRỌNG về người dùng, dòng 7, tôi nhận được "SetEnv takes 1-2 arguments, an environment variable name and optional value to pass to CGI."- tại sao?
hhh

Tôi đoán giá trị đó là trống, vì vậy setenv chỉ nhìn thấy 0 đối số. Vì apache sử dụng quy tắc chuyển hướng nên có thể REMOTE_USER trống, vì vậy chúng tôi lấy REDIRECT_RMEOTE_USER. Bạn sẽ có thể thực hiện chuyển nhượng tùy chọn nếu RMEOTE_USER đã được xác định (hay đúng hơn là người dùng REDIRECT trống). httpd.apache.org/docs/2.0/mod/mod_setenvif.html#setenvif

7

Để bật " git đẩy " qua http, bạn phải bật WebDAV trên máy chủ web. Để làm điều đó cho Máy chủ web Apache, chỉ cần chỉnh sửa tệp cấu hình:

vim /etc/httpd/conf/httpd.conf

Sau đó tìm kiếm dòng bắt đầu bằng:

<Directory "/var/www/html">

Thêm dòng sau ngay sau nó:

Dav On

Hãy chắc chắn rằng bạn có dòng sau đây trong httpd.conf không bị lỗi:

LoadModule dav_fs_module modules/mod_dav_fs.so

Sau đó bạn đã sẵn sàng. Khởi động lại máy chủ web Apache bằng cách sử dụng:

service httpd restart

Ngoài ra, hãy đảm bảo làm cho tất cả các tệp kho git trên máy chủ có thể ghi được bởi pache: người dùng và nhóm apache bằng cách sử dụng:

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

Nếu không, việc không đặt quyền chính xác sẽ dẫn đến "lỗi PUT: curl result = 22, HTTP code = 403" khi thực hiện "git đẩy".

Bây giờ chỉ cần thực hiện một "git đẩy" từ máy khách của bạn và tất cả sẽ hoạt động.


Lưu ý, nếu người sử dụng vượt qua trở ngại này, nhưng thấy lỗi trong các bản ghi apcahe về nhận-pack stackoverflow.com/questions/792611/...

2
Điều này sẽ hoạt động, nhưng DAV không bắt buộc và thực sự hoạt động chậm hơn nhiều so với http thông minh.

4

Bạn không thể đẩy vào một kho lưu trữ mà bạn đã nhân bản qua HTTP. Bạn cần cập nhật URL thành một ssh://hoặc một git://loại URL.


Tôi đã sử dụng lệnh clone tương tự. Nó hoạt động trước khi tôi xóa nhầm ....

bạn có git remote -vgì với
Vịt cao su hùng mạnh

Không hoàn toàn đúng. Bạn có thể đẩy trở lại kho lưu trữ, giả sử DAV được bật.

6
Điều này là không chính xác. Git kể từ 1.6.6 hỗ trợ đẩy và kéo http thông minh bằng cách sử dụng apache và git-http-backend.

3

Chỉnh sửa phần sau của tệp .git / config của bạn:

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

đến

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

Sau đó thử git push origin master.

Chỉnh sửa chi tiết xác thực trong tệp cấu hình của bạn cho các URL kho lưu trữ khác theo yêu cầu và đẩy sang nhánh được yêu cầu.


Lưu ý: Tôi đã sử dụng phương pháp này và nó đã giải quyết được vấn đề của tôi - tuy nhiên tôi nghĩ việc lưu trữ mật khẩu trong tệp cấu hình có vẻ sai, vì vậy tôi đã bỏ nó đi (hy vọng được nhắc nhở về nó) và có thể sử dụng nó như vậy.
chris

git remote set-url origin ...làm việc tốt
Maximilian Hils

1

Tôi gặp vấn đề tương tự với thao tác đẩy với git-http-backend, cấu hình xác thực ldap.
Cuối cùng tôi đã tìm thấy giải pháp và mô tả nó trong câu hỏi về lỗi máy chủ này

Có lẽ nó sẽ giúp một người có vấn đề tương tự.


0

Tuyệt quá

tôi đã có lỗi khác nhưng nó hoạt động!

tôi cố gắng giải thích:

  • cài đặt máy chủ Ubuntu với apache2 và webdav
  • Hãy xem http://www.mabishu.com/blog/2011/02/09/setup-a-remote-git-reposeective-USE-http-with-push-support-and-digest-auth/ để biết chi tiết
  • nhân bản trên máy khách -> Hoàn hảo!
  • thay đổi một cái gì đó....
  • đẩy -> thất bại
  • thay đổi chủ sở hữu trên máy chủ
  • Lỗi "Lỗi PUT: curl result = 22, mã HTTP = 403" đã biến mất ..
  • bây giờ chỉ nói git-http-đẩy thất bại
  • máy chủ: Could not LOCK /path/to/www/gitproject/refs/heads/master due to a failed precondition (e.g. other locks)
  • tôi đã sử dụng câu trả lời từ user1520409ist hoạt động.

NHƯNG làm thế nào để ẩn mật khẩu từ văn bản tại tin nhắn đẩy?


-1

Điều này cũng có thể xảy ra nếu bạn nhập sai mật khẩu.


Tôi chưa bao giờ thấy rằng: Tôi luôn nhận được fatal: Authentication failedđầu tiên
Rup
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.