如何最好地处理Git部署对于多个Web服务器

时间:2012-09-07 13:52:04

标签: git svn version-control

我正在将我们的代码库从svn转换为git。

我们当前的部署过程是运行内部脚本,将最新的svn修订版检出到新创建的目录中,以在服务器上创建工作副本。然后它运行任何需要发生的sql命令,并将符号链接从curent工作副本更改为新签出的工作副本。

这是处理更新的一种简单方法,如果出现问题,我们可以通过更改符号链接轻松地将代码库回滚到旧代码库。

是否可以从git服务器只将一个指定的分支提取到新创建的目录中,还是需要克隆存储库的全部内容?

或者是否有更好的方法来使用git处理代码库?

3 个答案:

答案 0 :(得分:2)

git中的每个提交都由“sha1”id标识。此id表示文件的精确快照。因此,您可以只执行特定提交的git checkout,而不是创建多个工作副本并对其进行符号链接。要回滚,您只需检查上次已知的良好提交ID。由于结账工作速度非常快(与SVN相比),并且不依赖于网络仓库(所以它永远不会失败),我建议你忘记这个符号化的噩梦。

要制作更加人性化的ID,您可以使用标签(基本上是提交ID的人类可读别名)。

答案 1 :(得分:0)

Git是一个分布式存储库。在进行git克隆时,你需要克隆整个存储库,你不能只是克隆一个分支或一个sha id。但是,git被压缩得很好,因为git你不应该对你的策略有任何问题。

我们在工作中这样做并且已经使用这种方法超过5年了 - 它不会减慢我们的速度,我们有一个持续交付系统,允许我们在一天内多次部署到生产,我们的部署大约3分钟 - 取决于数据库迁移。

很抱歉,答案是 - 您必须克隆整个存储库。

答案 2 :(得分:0)

我们有以下方案:

  1. 我们使用gitolite对我们的网络存储库进行访问控制,并让我们的构建服务器使用一个只对存储库具有读访问权限的特殊SSH密钥。
  2. 我们的构建机器上有一个完整的克隆,并定期从构建脚本中获取。
  3. 我们使用标签名称来标记要构建的内容。我们使用2012-09-01 [a-z]作为这些名称的模式,因为它们很好地排序。例如。如果您每天需要多个版本,2012-09-01之后是2012-09-01a ...也可以使用完整的时间戳。
  4. 当自动shell脚本看到要更改的标记(最后一个标记是最新的)时,会进行结帐/重建。
  5. 不需要符号链接,因为git中的checkout非常快。您也可以使用

    git -xfd clean
    

    确保您的源代码树是闪闪发光的,以防脚本离开。

    然后,您的开发团队只需创建一个标记并推送它以获得更新的版本:

    git tag 2012-09-01
    git push
    

    当然标签可以使用嵌套名称,因此您可以执行以下操作:

    git tag test/2012-09-01
    git tag release/2012-09-01
    ...
    

    对您正在做的事情进行分类:测试修正,处理发布等等。