"Потокобезопасный" git pull или как избежать "... /. Git / index.lock ': файл существует". - PullRequest
2 голосов
/ 01 апреля 2019

Предположим, у меня есть две сборки Jenkins, которые иногда начинаются вместе, если обе они требуют одного и того же git-репозитория и пытаются собрать их вместе, одна из них завершится с ошибкой:

fatal: Unable to create '/project_path/.git/index.lock': File exists.

Есть ли лучший способ сделать это, кроме проверки, существует ли "index.lock"?

1 Ответ

3 голосов
/ 01 апреля 2019

* * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * 100 * *1004* * * * * * * * * * *1004* 1006 * вид проблемы, возникающей при использовании git pull.Если вы избегаете git pull, заменяя каждую git pull двумя командами Git, которые запускает Git git pull, проблема может быть более очевидной (или может просто перейти ко второй команде Git ?):

git fetch && git merge

или:

git fetch && git rebase

(но не делайте этого!).

Проблема, которая, я надеюсь, теперь очевидна, но, возможно,просто скрытый во второй половине && здесь, это то, что git merge или git rebase изменит рабочее дерево .Если у вас есть какие-то команды, работающие в рабочем дереве , в то время как вы изменяете рабочее дерево, эти команды будут видеть несовместимые наборы файлов.

Предположим,например, git merge или git rebase изменят как main.py, так и routine.py.Сначала он может изменить main.py, и в этот момент интерпретатор Python загрузится и будет использовать обновленный main.py, для которого требуется новый код из routine.py, но сам Git еще не дошел до обновления routine.py.

Обычный способ избежать этой проблемы - убедиться, что рабочее дерево обновлено до запуска любых операций, будь то задания Jenkins, этапы в одном задании Jenkins,или просто все, что вы намереваетесь запустить самостоятельно.Если рабочее дерево обновлено до , вам не нужно git pull, потому что оно обновлено.

Если вы хотите, чтобы задание Jenkins запускало определенные команды Git,Работа, вероятно, должна иметь свое собственное дерево работы.Частное рабочее дерево, будь то основное рабочее дерево отдельного репозитория или просто добавленное рабочее дерево общего репозитория, имеет свой собственный HEAD и индекс, а следовательно, и частное index.lock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...