git push fatal nie powiodło się


24

Jakoś usunąłem cały katalog mojej gałęzi kodu. Sklonowałem nowy. Działało dobrze oprócz pchania.

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

git pull działa jednak. Jak mogę to naprawić?

git  push 

1
Przeczytaj tę instrukcję tutaj i zwróć uwagę na punkt http.receivepack.
hhh

Odpowiedzi:


33

Popełniłem błąd, używając https zamiast ssh do nowej kopii. Od tego czasu wprowadzałem modyfikacje i zmiany, ale nie mogłem naciskać z oczywistych powodów.

Aby odzyskać, po prostu zmieniłem sekcję [zdalne „pochodzenie”] w .git / config z

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

do

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

Potem mogłem ponownie naciskać.


2
Nie musisz przechodzić na inny protokół, przeczytaj moją odpowiedź poniżej, jeśli chcesz przesłać http.
Basil A

1
Zgadzam się z Basilem, jest to zbędne i niemożliwe w niektórych środowiskach korporacyjnych, które mają ograniczony dostęp przez zapory ogniowe itp.

... problem polega na tym git-http-push failed, że widzę, że operacja próbuje skonfigurować rzeczy albo przez HTTP albo https, -1.
hhh

14

Szybsze przesyłanie HTTP za pomocą samego git - webDAV nie jest wymagane

Nowa obsługa „smart-http” od git 1.6.6. Nowa metoda umożliwia jednoczesne przesłanie całego pakietu, a nie pojedynczych plików.

Możesz także użyć gitweb, aby zapewnić przeglądalne adresy URL w tej samej lokalizacji.

Uwaga: Ponieważ dostęp jest kontrolowany przez apache, możesz dodać dowolne wymagania Auth (htaccess lub ldap itp.) Do konfiguracji dla każdego repozytorium.

Ta odpowiedź zakłada, że ​​jesteś właścicielem zdalnego serwera i chcesz dodać / naprawić obsługę HTTP.

PO PIERWSZE: Sprawdź dzienniki apache, prawdopodobnie nie ma uprawnień / nie można zlokalizować błędu, gdy apache próbuje wykonać skrypty cgi wspierane przez git-http.

Dodanie obsługi HTTP do git

Po prostu stwórz nowy plik git_support.conf i dołącz go do apache (dodaj instrukcję include w 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/

Rezultatem jest zdolność do pchania / ciągnięcia:

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

Możesz przeglądać te zmiany online .. gitweb zapewnia możliwy do przeglądania interfejs

Źródło: http://repo.or.cz/w/alt-git.git?a=blob_plain;f=gitweb/README


Kiedy uruchamiam WAŻNE zdanie o użytkowniku, wiersz 7, otrzymuję "SetEnv takes 1-2 arguments, an environment variable name and optional value to pass to CGI."- dlaczego?
hhh

Domyślam się, że ta wartość jest pusta, więc setenv widzi tylko 0 argumentów. Ponieważ apache używa reguły przekierowania, możliwe jest, że REMOTE_USER jest pusty, więc łapiemy REDIRECT_RMEOTE_USER. Powinieneś mieć możliwość uczynienia przypisania opcjonalnym, jeśli RMEOTE_USER jest już zdefiniowany (a raczej jeśli użytkownik REDIRECT jest pusty). httpd.apache.org/docs/2.0/mod/mod_setenvif.html#setenvif

7

Aby włączyć „ git push ” przez HTTP, musisz włączyć WebDAV na serwerze WWW. Aby to zrobić dla Apache Webserver, po prostu edytuj plik konfiguracyjny:

vim /etc/httpd/conf/httpd.conf

Następnie wyszukaj wiersz zaczynający się od:

<Directory "/var/www/html">

Dodaj następujący wiersz tuż po nim:

Dav On

Upewnij się, że masz następujący wiersz również w httpd.conf bez komentarza:

LoadModule dav_fs_module modules/mod_dav_fs.so

Po tym jesteś gotowy. Uruchom ponownie serwer Apache Webserver, używając:

service httpd restart

Upewnij się również, aby wszystkie pliki repozytorium git na serwerze były zapisywalne przez użytkownika i grupę pache: apache:

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

W przeciwnym razie niepowodzenie ustawienia poprawnych uprawnień spowoduje „błąd PUT: wynik zawinięcia = 22, kod HTTP = 403” podczas wykonywania „git push”.

Teraz po prostu wykonaj „git push” z komputera klienckiego i wszystko powinno działać.


Uwaga: jeśli użytkownicy przejdą tę przeszkodę, ale zauważą błąd w dziennikach apcahe dotyczących pakietu odbiorczego stackoverflow.com/questions/792611/…

2
To zadziała, ale DAV nie jest wymagany i faktycznie działa znacznie wolniej niż smart-http.

4

Nie można naciskać na repozytorium sklonowane przez HTTP. Musisz zaktualizować adres URL do adresu URL typu ssh://lub git://.


Użyłem tego samego polecenia klonowania.

co masz z git remote -v?
The Mighty Rubber Duck,

Nie do końca prawda. Możesz wypychać z powrotem do repozytoriów, zakładając, że DAV jest włączony.

6
To jest niepoprawne. Git od wersji 1.6.6 obsługuje inteligentne wypychanie i ściąganie HTTP za pomocą apache i backendu git-http.

3

Edytuj następującą sekcję pliku .git / config:

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

do

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

Więc spróbuj git push origin master.

Edytuj szczegóły uwierzytelnienia w plikach konfiguracyjnych dla innych adresów URL repozytorium zgodnie z wymaganiami i przekaż do wymaganego oddziału.


Uwaga: użyłem tej metody i rozwiązałem mój problem - jednak myślałem, że przechowywanie hasła w pliku konfiguracyjnym wydaje się nieprawidłowe, więc zrezygnowałem z niego (mając nadzieję, że zostaniesz o to poproszony) i mogłem go użyć jako takiego.
Chris 10'13

git remote set-url origin ...działa również.
Maximilian Hils


0

Świetny

Miałem inne błędy, ale działa!

próbuję wyjaśnić:

ALE jak ukryć hasło przed tekstem w wiadomości push?


-1

Może się to również zdarzyć, jeśli wprowadzisz nieprawidłowe hasło.


Nigdy tego nie widziałem: zawsze dostaję fatal: Authentication failedpierwszy
Rup
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.