【问题标题】:concurrent git pulls to same local repository并发 git 拉到同一个本地存储库
【发布时间】:2015-03-11 15:50:02
【问题描述】:

我的任务是维护一个 Jenkins 服务器,该服务器的工作基本上是检查一些代码并构建它。目前,他们使用“--depth 1”和“-b {branch}”选项进行 git clone,以尽快获得特定的代码分支。但这仍然很浪费,因为每次执行作业时都会(通过网络)签出新副本,即使更改很少(如果有的话)。

相反,我想做的是在构建机器上拥有一个共享的本地存储库,它是我们远程存储库的克隆。每个作业都会在特定分支上执行“git pull”以从远程存储库中引入任何更改,然后在开始构建之前将源代码树从存储库复制到其 Jenkins 工作区。

这是个坏主意吗?

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

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

其中一个并发拉取是否可能由于锁定问题而失败?

共享的本地存储库永远不会有任何更改提交给它,也不会从它推送到远程存储库。可以这么说,这将是“仅拉动”。所有的拉取都来自同一个用户,所以不应该有任何文件权限问题。

一些谷歌搜索从 4 年前发现了这个讨论,但似乎没有结论:

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

【问题讨论】:

    标签: git jenkins git-pull git-clone


    【解决方案1】:

    这是个坏主意吗?
    可以想到以下场景。
    假设 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 好一个!!!根据您建议的规则,它应该适用于任何一种情况(相同的分支或不同的分支)。
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2014-09-06
    • 1970-01-01
    • 2015-07-14
    • 2018-08-14
    • 2013-03-02
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多