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

时间:2015-09-15 00:57:43

标签: git

我试图用GIT做我以前用SVN和#34; checkout"。

的一行。

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

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

您拥有的信息是

  • GIT存储库(例如git://github.com/gwaldron/osgearth.git
  • GIT引用,可以是任何分支(例如master),标记(例如osgearth-2.6)或特定提交(例如e42866faa3f042e942cfc707f78e9d0d99d64a45 ),你事先并不知道这些事情(分支/标签/提交)是什么。

您希望将该版本的代码签入到可能存在或可能不存在的工作目录中。此外,它可能先前已更新,以跟踪您现在要跟踪的分支/标记/提交。

我最好的尝试如下。为了便于阅读,我列出了下面的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
  • &#34; Fetch --tags&#34;似乎有必要,如果我需要更新到新创建的标签。我不能&#34;结帐&#34;标签,除非我拿到它。
  • &#34;合并&#34;似乎是必要的,因为&#34; fetch&#34;没有得到来自&#34; origin&#34;的所有提交。对于之前未跟踪过的分支机构。
  • &#34;拉&#34;似乎有必要在分支机构上获得最新的更改。对我来说,情况并非如此,因为&#34; pull&#34;应该是&#34; fetch&#34;那么&#34;合并&#34;,但实验上似乎确实如此。
  • 这个命令序列在&#34; git merge&#34;如果git引用是特定提交,则执行步骤。 (错误信息是&#34;合并:origin / b509a0cee255cdf55afe5cbd75be3944555b7332 - 不是我们可以合并的东西&#34;)

1 个答案:

答案 0 :(得分:5)

首先:尝试git checkout -f <ref>。正如@ChrisBeck正确地表明它可以满足您的需求。

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

  1. 如果您还没有clone d所需的存储库,请将其克隆为裸存储库。
  2. 使用例如core.barefalse设置为git config git new-workdir <path/to/bare-repository> <a-new-directory> <ref>
  3. 现在您应该使用git submodule init每个请求的构建创建一个专用的工作目录。
  4. git submodule update&amp;如果需要contrib
  5. 因此,您可以避免代码的不同版本之间的冲突问题,避免需要奇怪的合并和其他可能脆弱的操作。此外,还需要为不同的构建构建工件,以防需要它们来处理代码中的问题。可能你还需要组织某种“构建轮换”,完全删除一段时间内无法访问的构建目录。

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