我的任务是维护Jenkins服务器的工作,基本上检查一些代码并构建它。目前,他们使用“--depth 1”和“-b {branch}”选项进行git克隆,以尽快获得特定的代码分支。但这仍然是浪费,因为每次工作执行时都会检查(通过网络)新的副本,即使很少(如果有的话)更改。
相反,我想要做的是在构建机器上有一个共享的本地仓库,它是我们远程仓库的克隆。每个作业都会在特定分支上执行“git pull”以从远程仓库引入任何更改,然后在开始构建之前将源树从repo复制到其Jenkins工作区。
这是个坏主意吗?
我担心的是,同一个代码分支的不同作业可能同时运行,这可能会导致并发“git pull”请求。
这会导致Git的元数据损坏吗?
由于锁定问题,其中一个并发拉动可能会失败吗?
共享本地存储库永远不会对其提交任何更改,也不会将任何内容从它推送到远程存储库。可以这么说它只是“拉动”。所有拉动都来自同一个用户,因此不应该有任何文件权限问题。
有些谷歌搜索引发了4年前的讨论,但似乎没有结论:http://git.661346.n2.nabble.com/concurrent-fetches-to-update-same-mirror-td5893458.html
答案 0 :(得分:0)
这是个坏主意吗?
可以想到以下场景。
假设Job1执行git pull并检出最新代码并开始从本地git存储库复制到工作区。在这个特定时刻,Job2做了一个git pull,当复制过程仍在进行时,很少有文件被复制(对于大型存储库,我相信它是可能的)。在这种情况下,您可能会有两个结帐的文件,这不是您想要的。如果在这种特殊情况下出错,请纠正我。
虽然不是原始问题的一部分,但添加以下内容可能对其他人有用。
既然如此,你已经清楚地提到过你不会对git做出任何回应,你就不会遇到竞争条件。
“提示:更新被拒绝,因为您当前分支的提示落后了
提示:它的远程对应物。合并远程更改(例如'git pull')
提示:再次推动之前。
提示:有关详细信息,请参阅'git push --help'中的'关于快进的说明'
孩子退出,价值1 - “
如果您的作业在执行后将几个文件签入git(更新版本号,更改日志等...),则会遇到此错误。当您从git签出特定修订版并且在存储库的同一分支中有一个新的签入并且当前作业尝试提交更新的文件并且它发现git不在同一个中时,会发生此错误签出时的版本。