我试图用GIT做我以前用SVN和#34; checkout"。
的一行。哪些GIT命令序列可以可靠地将工作目录更新为特定的分支/标记/代码提交?
这些命令在Continuous Integration环境中执行。我有很多通过GIT导入的第三方依赖项,它们有各种分支和标记策略。顶级存储库是SVN,因此GIT子模块不是一种有用的方法。从一个版本到另一个版本,我们可能会更新到第三方库的较新版本,因此我们需要更新我们的工作文件夹。我在ubuntu和windows上运行这些命令,分别用bash和powershell编排。我建立的项目大多是C ++。
您拥有的信息是
git://github.com/gwaldron/osgearth.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
答案 0 :(得分:5)
首先:尝试git checkout -f <ref>
。正如@ChrisBeck正确地表明它可以满足您的需求。
如果不是出于某些原因,这是“准CI”系统的复杂解决方案:
clone
d所需的存储库,请将其克隆为裸存储库。core.bare
将false
设置为git config
git new-workdir <path/to/bare-repository> <a-new-directory> <ref>
。git submodule init
为每个请求的构建创建一个专用的工作目录。git submodule update
&amp;如果需要contrib
。因此,您可以避免代码的不同版本之间的冲突问题,避免需要奇怪的合并和其他可能脆弱的操作。此外,还需要为不同的构建构建工件,以防需要它们来处理代码中的问题。可能你还需要组织某种“构建轮换”,完全删除一段时间内无法访问的构建目录。
git-new-workdir
是/usr/libexec/git-core/
目录中的脚本。您需要将其复制/链接到s
(或者git内部实用程序位于您的发行版中)并使其可执行。