如何使用Git部署项目

时间:2014-06-27 21:04:26

标签: git deployment version-control

我找到了一个解决方案,但我觉得必须有一个更简单的部署方式,使用Git。解决方案是

  1. 使用Git本地开发应用程序
  2. 设置Git服务器
    • 将本地存储库本地克隆为裸存储库
    • 将裸存储库复制到远程服务器
    • 将裸存储库设置为远程存储库
  3. 将存储库从裸存储库克隆到服务器(以便具有工作目录的存储库)
  4. 通过推送本地提交的更改来更新裸存储库。
  5. 通过从裸仓库中提取更改来更新工作目录
  6. 这不是一个简单的解决方案,可能有更好的方法来使用Git进行部署。我试图在服务器上单独使用裸存储库,并将git配置文件中的工作树变量设置到另一个目录,但它没有工作:在第一次检出后,我更新了裸仓库和试图查看更改,似乎一切正常,但工作目录中没有任何反应。然后我决定克隆裸存储库,因此克隆的repo有一个工作目录,它可以通过git pull更新(这可以将来自裸存储库的更改作为其原始远程存储库)。

    此解决方案的一大优势是您可以修复服务器上的代码,提交这些更改,更新裸存储库,然后您只需更新本地存储库。另一个优点是您可以从裸仓库中克隆项目,如果他们有权访问服务器,则更多参与者可以参与开发。

    您是否了解具有上述优势的简单方法?

1 个答案:

答案 0 :(得分:3)

我要向你描述我要做的是什么,所以它可能对你有用。我还将提供一些细节,以便将来可以帮助新的企业。

我有一个服务器,我喜欢运行一些个人实验,我用git以我发现的最简单的方式进行部署。它是使用git附带的钩子和很少的shell脚本完成的。

我们走了:

首先:初始化服务器中的裸存储库。与普通git存储库的不同之处在于缺少工作树(项目文件和常见的东西)。您只需要存储库树。

git init --bare 

如果你看一下裸露的结构,你会看到这样的东西:

› git init --bare
Initialized empty Git repository in /home/git/mysite/
› ls
branches  config  description  HEAD  hooks  info  objects  refs

如果仔细查看 hooks 文件夹,可以找到一些有趣的内容:

daniel at heavens-empire into /home/git/mysite/hooks  
› ls
applypatch-msg.sample  post-update.sample     pre-commit.sample      
pre-push.sample        update.sample          commit-msg.sample      
pre-applypatch.sample  prepare-commit-msg.sample  pre-rebase.sample

每个文件都是可以在某些事件后触发的脚本示例。今天我们正在观看收到后的活动(它没有出现在这个版本中......我不知道为什么)。它发生在我们推送到裸存储库时。你可以创造它并在其中加入一些贝壳之美:

#shows file content
daniel at heavens-empire into /home/git/mysite/hooks$ cat post-receive  

#!/bin/sh

GIT_WORK_TREE=/home/www/site git checkout -f

GIT_WORK_TREE将确定我推送的工作树的文件的位置。这就像你在一个文件夹中有repo并说树在另一个。

我已经从我的玩具服务器复制了这些脚本,所以我可能会说他们应该和你一起工作,改变适当的工作树变量。

在我的本地存储库中,我只是将该裸文件夹添加为远程仓库。我会用ssh来简单化。在这种情况下,请确保您用于访问的用户对工作树文件夹具有适当的权限:

git remote add mygitserver daniel@heavensempire.com:/home/git/mysite

每次推送时,您的本地git都会发送提交。当服务器git repo接收并接受它们时,它将触发该接收后脚本。设置工作树并给出权限后,它将在应用程序运行的文件夹上进行简单检查。

我希望这对你有用,也可能对别人有用。 Personaly我避免在服务器上编辑东西。如果您发现在服务器中反映完整的repo很有用,您还可以使用post-receive进行克隆/推送,并在另一个repo中为您结账。 类似的东西:

cd /home/mysite
git pull repo/folder masterOrOther