使用Git部署项目的方法

4
我找到了一个解决方案,但我觉得使用Git进行部署可能有更简单的方法。该解决方案如下:
  1. 使用本地Git开发应用程序
  2. 设置Git服务器
    • 将本地仓库克隆为裸仓库
    • 将裸仓库复制到远程服务器
    • 将裸仓库设置为远程仓库
  3. 从裸仓库克隆一个带有工作目录的仓库到服务器上
  4. 通过推送本地提交的更改来更新裸仓库
  5. 通过从裸仓库拉取更改来更新工作目录
这不是一个简单的解决方案,也许使用Git进行部署有更好的方法。我试过在服务器上只使用裸仓库,并在git配置文件中设置work-tree变量为其他目录,但它没有起作用:在第一次检出之后,当我更新裸仓库并尝试检出更改时,似乎一切正常,但工作目录中没有发生任何事情。然后我决定克隆裸仓库,这样克隆的仓库就有了工作目录,并且可以通过git pull更新(这将从裸仓库中拉取更改,作为其源远程仓库)。
这种解决方案的重要优势在于,您也可以在服务器上修复代码,提交这些更改,更新裸仓库,然后就可以简单地更新本地仓库了。另一个优点是,您可以从裸仓库中克隆项目,如果他们有权限访问服务器,更多参与者可以参与开发。
你知道有没有一种更简单的方式来实现上述优点?

1
Git不是一个构建或部署工具。你可以有点像使用它,但这不是它的设计目的。为了获得最佳效果,请使用构建工具来构建软件和部署工具来部署软件。 - Chris
好的,这只是一个实验,但对于一个小项目来说它运行良好。 - tompascall
1个回答

6
我将为您描述我如何实现这一目标,这对您可能很有用。我还会提供一些细节,以帮助未来的新手。
我有一个服务器,我喜欢在上面运行一些个人实验,并使用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

这些文件中的每一个都是一种在某些事件后可以触发的脚本示例。今天我们将关注post-receive事件(它没有出现在此版本中...我不知道为什么)。当我们推送到裸仓库时会触发该事件。您可以创建它并添加一些Shell美化效果:

#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仓库接收并接受它们时,它将触发post-receive脚本。设置工作树并授予权限后,它将在应用程序预定运行的文件夹上进行简单的检出。
我希望这对您和其他人有所帮助。个人而言,我避免在服务器上编辑东西。如果您发现在服务器上反映完整存储库很有用,则还可以使用post-receive在另一个存储库中进行克隆/推送,然后进行检出,类似于:
cd /home/mysite
git pull repo/folder masterOrOther

谢谢!我之前尝试过几乎相同的方法,但是当我检出时没有使用-f选项,所以失败了。 - tompascall
1
谢谢!8年后,这个完美地运作了。 - Vinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接