gpt4 book ai didi

git - 什么样的 GIT 命令序列可以可靠地将工作目录更新到特定的代码分支/标签/提交?

转载 作者:太空狗 更新时间:2023-10-29 14:32:14 25 4
gpt4 key购买 nike

我正在尝试用 GIT 做我以前用 SVN“checkout ”在一行中做的事情。

什么样的 GIT 命令序列可以可靠地将工作目录更新到代码的特定分支/标记/提交?

这些命令在持续集成环境中执行。我有大量通过 GIT 导入的第三方依赖项,它们有多种分支和标记策略。顶级存储库是 SVN,因此 GIT 子模块不是一个有用的方法。从一个构建到另一个构建,我们可能会更新到第三方库的更新版本,因此我们需要更新我们的工作文件夹。我在 ubuntu 和 windows 上运行这些命令,分别用 bash 和 powershell 编排。我正在构建的项目主要是 C++。

你掌握的信息是

  • GIT 存储库(例如 git://github.com/gwaldron/osgearth.git)
  • GIT 引用,可以是分支(例如 master)、标签(例如 osgearth-2.6)或特定的任何提交(例如 e42866faa3f042e942cfc707f78e9d0d99d64a45),而您事先并不知道它是这些东西中的哪一个(分支/标签/提交)。

您想将该版本的代码 check out 到一个可能存在也可能不存在的工作目录中。此外,它之前可能已更新为跟踪与您现在要跟踪的分支/标签/提交不同的分支/标签/提交。

我最好的尝试如下。为了便于阅读,我在下面列出了 git 命令,完整的 powershell 脚本是 here .

(if working directory exists) git fetch <repository> --tags
(if directory does not exist) git clone <repository> <destination>
git checkout <branch/tag/commit>
git merge "origin/<branch/tag/commit>"
git pull
  • 如果我需要更新到新创建的标签,“Fetch --tags”似乎是必需的。除非已获取标签,否则我无法“ checkout ”标签。
  • “merge”似乎是必要的,因为“fetch”并未从“origin”获取先前未跟踪的分支的所有提交。
  • “pull ”似乎是获取分支上最新更改所必需的。对我来说,这种情况没有意义,因为“pull ”应该是“获取”然后是“merge ”,但实验上似乎确实如此。
  • 如果 git 引用是一个特定的提交,这个命令序列在“git merge”步骤失败。 (错误消息是“merge :origin/b509a0cee255cdf55afe5cbd75be3944555b7332 - 不是我们可以 merge 的东西”)

最佳答案

首先:尝试 git checkout -f <ref> .正如@ChrisBeck 正确建议的那样,它可能足以满足您的需求。

如果不是出于某些原因,这里有一个“准 CI”系统的复杂解决方案:

  1. 如果你还没有clone d 所需的存储库,将其克隆为裸存储库。
  2. 设置core.barefalse使用例如git config .
  3. 现在你应该使用git new-workdir <path/to/bare-repository> <a-new-directory> <ref>每个请求的构建创建一个专用的工作目录。
  4. git submodule init & git submodule update如果需要的话。

因此,您可以避免不同版本代码之间的冲突问题,避免奇怪的 merge 和其他可能脆弱的操作。还保留了不同构建的构建工件,以防万一需要它们来处理代码中的问题。可能您还需要组织某种“构建轮换”,以完全删除一段时间内未访问的构建目录。

git-new-workdir contrib 中的一个脚本目录。您需要将其复制/链接到 /usr/libexec/git-core/ (或 git 内部实用程序位于您的发行版中的任何位置)并使其可执行。

关于git - 什么样的 GIT 命令序列可以可靠地将工作目录更新到特定的代码分支/标签/提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32576032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com