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.
Василь А

1
Погодьтеся з Василем, це непотрібно і неможливо в деяких корпоративних середовищах, які мають обмежений доступ через брандмауері тощо.

... проблема в тому git-http-push failed, я бачу, що оператор намагається налаштувати речі або через http, або через https, -1.
hhh

14

Швидше HTTP Push з лише git - webDAV не потрібно

Нова підтримка "smart-http" з git 1.6.6. Новий метод дозволяє передавати весь пакет відразу, а не як окремі файли.

Ви також можете використовувати gitweb для надання веб-переглядачів, які переглядаються в тому самому місці.

Примітка: Оскільки доступ контролюється апашем, ви можете додати будь-які вимоги Auth (htaccess або ldap тощо) до налаштування для кожного сховища.

Ця відповідь передбачає, що ви володієте віддаленим сервером і хочете додати / виправити підтримку http.

ПЕРШЕ: Перевірте журнали apache, імовірно, у дозволі відмовлено / не вдається знайти помилку, коли apache намагається виконати cgi-скрипти, підтримувані git-http.

Додавання підтримки HTTP до git

Просто створіть новий файл git_support.conf і включіть його в apache (додайте, включити оператор у 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, просто відредагуйте файл конфігурації:

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

Також переконайтеся, що користувачі та групи pache: apache користуються командою pache: apache, використовуючи:

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

В іншому випадку, якщо не встановити правильних дозволів, це призведе до "PUT помилки: результат curl = 22, код HTTP = 403" при виконанні "git push".

Тепер просто зробіть "git push" від вашої клієнтської машини, і все повинно працювати.


Зауважте, якщо користувачі проходять цю перешкоду, але бачать помилку в журналах apcahe про get-pack 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 ...працює також.
Максиміліан Хілс


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: результат згортання = 22, код HTTP = 403" пішов ..
  • тепер лише кажуть, що git-http-push не вдалося
  • сервер: Could not LOCK /path/to/www/gitproject/refs/heads/master due to a failed precondition (e.g. other locks)
  • Я використав відповідь з user1520409творів ist.

АЛЕ як сховати пароль від тексту на push-повідомленні?


-1

Це також може статися, якщо ви ввели неправильний пароль.


Я ніколи цього не бачив: я завжди отримую fatal: Authentication failedперше
Rup
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.