同时进行的git拉取到同一本地仓库

3
我被指派维护一个 Jenkins 服务器,其中的任务基本上是检出一些代码并构建它。目前,它们使用 "--depth 1" 和 "-b {branch}" 选项进行 git 克隆以尽快获取特定的代码分支。但这仍然是浪费的,因为每次作业执行时都会检出(通过网络)一个新的副本,即使几乎没有任何更改。

相反,我想在构建机器上有一个共享的本地仓库,它是我们远程仓库的克隆。每个作业将在特定分支上执行 "git pull" 以从远程仓库中获取任何更改,然后在开始构建之前将源树从仓库复制到其 Jenkins 工作区。

这是个坏主意吗?

我担心的是针对同一代码分支的不同作业将同时运行,这可能会导致并发的 "git pull" 请求。

这会导致 Git 的元数据损坏吗?

由于锁定问题,是否有一个并发的拉取可能会失败?

共享的本地仓库不会有任何更改提交到它,也不会有任何东西从它推送到远程仓库。可以说它是一个“只拉取”的仓库。所有的拉取都来自同一用户,因此不应该出现文件权限问题。
一些谷歌搜索找到了这个四年前的讨论,但似乎没有得出结论:

http://git.661346.n2.nabble.com/concurrent-fetches-to-update-same-mirror-td5893458.html

1个回答

0

这是一个不好的想法吗?
可以考虑以下情况。
假设Job1执行了git pull并检出了最新的代码,然后开始从本地git仓库复制到工作区。在这个特定的时刻,Job2执行了git pull,并且在复制过程仍在进行时复制了一些文件(对于大型仓库,我认为这是可能的)。在这种情况下,您可能会拥有来自两个检出的文件,这不是您想要的。如果我在这种特定情况下错了,请纠正我。

虽然不是原始问题的一部分,但添加以下内容可能对其他人有用。
由于您明确提到您不会将任何东西提交回git,因此您不会遇到竞争条件。

"提示:更新被拒绝,因为当前分支的顶端落后于其远程对应物。合并远程更改(例如'git pull')后再次推送。
提示:有关详细信息,请参见“git push --help”中的“有关快进的说明”。
子进程以值1退出-"

如果您的作业在执行后将几个文件提交到git(更新版本号、更改日志等),则会遇到此错误。当您从git检出特定修订版并且存储库的同一分支进行了新的签入时,就会发生此错误,并且当前作业尝试提交更新的文件时,它发现git与其检出时的版本不同。

  • 如果您没有将任何内容提交回git,则值得尝试,因为您可以通过避免多次拉取来节省空间/作业执行时间。
  • 如果您提交了任何内容,则不建议在多个作业之间共享单个git存储库。

不错。我觉得如果我实施规则,即不允许两个 Jenkins 作业针对同一分支,则没问题,因为给定作业的执行是串行化的。因此,作业 A 可能会同时从分支 A 拉取/复制,而作业 B 正在从分支 B 拉取/复制,但这不应该引起任何问题。对吧? - jph
@jph 不错!!!根据您提出的规则,它应该在任何情况下都能工作(同一分支或不同分支)。 - Pranesh Vittal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接