假设我有两个有时会一起开始的Jenkins构建,如果它们都需要相同的git存储库并尝试合并在一起,则其中一个将会失败:
fatal: Unable to create '/project_path/.git/index.lock': File exists.
除了检查是否存在“ index.lock”之外,还有更好的方法吗?
答案 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 merge
或git rebase
将修改作品-tree 。如果您有一些命令在工作树中工作,而在修改工作树时,这些命令将看到不一致的文件集。
例如,假设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
。>