Git push to remote терпит неудачу: невозможно создать../refs/heads/master.lock: неверный аргумент
У меня есть мое репозиторий git bare, инициализированный в папке удаленного сервера /home/bare/mygit.git
Я клонировал этот репо:
git clone user@ip.of.my.server:/home/bare/mygit.git .
Затем я работал с проектом, делал коммиты / толчки и т.д...
Но сегодня я заметил, когда я делал push эту ошибку:
user@host:/var/www/mygit (master)$ git push origin master
user@ip.of.my.server's password:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 297 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
fatal: Unable to create '/home/bare/mygit.git/refs/heads/master.lock': Invalid argument
fatal: The remote end hung up unexpectedly
fatal: recursion detected in die handler
Я искал эту проблему, но кажется, что в основном люди имеют проблемы с разрешениями. Но в этом случае ошибка выглядит иначе (например, Отказано в разрешении или что-то в этом роде).
Права в порядке, клонирование / извлечение / получение в порядке. Нет ошибок в журнале или что-то в этом роде.
2 ответа
Это не было проблемой, связанной с мерзавцами. В конце концов я не смог создать несколько новых файлов.
Когда я запустил dmesg, я увидел много ошибок в ядре. Я решил сначала перезагрузить сервер, а потом копать глубже, но после перезапуска сервера проблема исчезла.
Спасибо всем за помощь!
Обратите внимание, что в Git 2.14.x/2.15 (3-й квартал 2017 г.) это сообщение об ошибке будет встречаться реже.
Смотрите коммит 4ff0f01 (21 августа 2017 г.) Майкла Хаггерти ( mhagger
)
(Объединено Юнио С Хамано - gitster
- в коммите f2dd90f, 27 августа 2017 г.)
Код для получения блокировки ссылки (например, при получении push-запроса от клиента) используется для немедленного сбоя, когда ссылка уже заблокирована.
Теперь он ждет очень короткое время и повторяет попытку, что может сделать его успешным, если держатель замка удерживал его во время операции только для чтения.
Точнее:
refs
: повторите попытку получения эталонных замков на 100 мсФилософия блокировки ссылок заключалась в том, что "если другой процесс изменяет ссылку, то все, что я пытаюсь сделать с ней, вероятно, в любом случае потерпит неудачу, потому что мое старое значение SHA-1, вероятно, больше не является текущим".
Но этот аргумент сбрасывается, если другой процесс заблокировал ссылку, чтобы сделать что-то, что на самом деле не меняет значение ссылки, например
pack-refs
или жеreflog expire
,
На самом деле есть неплохой шанс, что запланированное обновление справки все же сможет пройти после того, как другой процесс снял блокировку.Поэтому при попытке заблокировать отдельную ссылку (например, при создании "
refs/heads/master.lock
"), если он уже заблокирован, повторите попытку захвата блокировки примерно на 100 мс, прежде чем сдаться. Это должно устранить некоторые ненужные конфликты блокировки, не тратя много времени.Добавить настройку конфигурации,
core.filesRefLockTimeout
, чтобы этот параметр можно было настроить.