“线程安全” git pull或如何避免“ ... /。git / index.lock':文件存在。”

时间:2019-04-01 05:02:20

标签: git jenkins-pipeline

假设我有两个有时会一起开始的Jenkins构建,如果它们都需要相同的git存储库并尝试合并在一起,则其中一个将会失败:

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

除了检查是否存在“ index.lock”之外,还有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

Daniel Alder notes一样,在此特定错误上进行记录可为您带来更深,更恶性的错误。

虽然git pull并不是问题所在,但这是使用git pull引起的种类问题的另一种症状。如果您避免使用git pull,可以通过用运行Git git pull的两个Git命令替换每个git pull,问题 可能更加明显(或者也许会解决)进入第二个Git命令):

git fetch && git merge

或:

git fetch && git rebase

(但也不要这样做!)。

我希望这个问题现在很明显,但可能只是隐藏在&&的后半部分,是git mergegit rebase修改作品-tree 。如果您有一些命令在工作树中工作,而在修改工作树时,这些命令将看到不一致的文件集。

例如,假设git mergegit rebase将同时修改main.pyroutine.py。它可能会首先修改main.py,就在此时,Python解释器将加载并使用需要main.py中的新代码的更新后的routine.py,但Git本身尚未解决更新routine.py

避免此问题的通常方法是,在开始任何操作之前,确保工作树是最新的,在执行任何操作之前,无论这些操作是Jenkins作业,单个Jenkins作业中的阶段还是仅您打算自己做的任何事情。一旦工作树 是最新的,您就不需要git pull,因为它是最新的。

如果您想让Jenkins作业运行特定的Git命令,则该作业可能需要具有自己的私有工作树。私有工作树,无论是单独存储库的主要工作树,还是共享存储库的添加工作树,都有自己的HEAD和索引,因此也有私有index.lock