Git开发到生产环境的设置

3
我知道类似这样的问题已经被问了很多次。但是,我没有找到确切的答案来解决我的问题。我正在开始使用Git。我之前没有任何使用Git或任何版本控制的经验。到目前为止,我已经能够在本地轻松运行Git。我可以通过终端使用Git,也开始尝试使用SourceTree应用程序。
但是当我尝试远程设置时,问题就出现了。我已经在服务器上安装了Git。我在远程暂存服务器上创建了一个仓库。我可以通过SourceTree将其推送上去。然而,似乎远程仓库并没有连接到web根目录。我在本地分支上进行更改、提交、合并,然后推送到远程,但是这些更改并没有出现在通过暂存服务器提供的页面上?
在远程上,我创建了一个目录,位于我的网站根目录之外,用于保存仓库项目。我在其中创建了一个名为mygit.git的子目录。使用git init --bare 创建了我的远程仓库。这应该会创建一个没有工作目录的仓库,我可以将其推送到其中。
这就是我正在使用的环境。
Production (remote server)
^
Staging (remote server)
^
Development (local)

所以,我的问题是:

  1. 为什么 Web 服务器没有显示通过本地推送进行的更改?
  2. 我是否应该在生产服务器上拥有存储库,以便所有更改都可以像冒泡一样传递到生产服务器?
  3. 我做错了吗?

感谢您对此的任何帮助。

2个回答

2
VonC的回答是正确的。除了VonC提供的链接,我还发现了这个链接http://toroid.org/ams/git-website-howto。我将沿着这个链接的过程来说明我做的事情。我提供的链接上次更新于2010年11月17日,但仍然有效。这并不是详尽无遗的,因为我相信还有许多其他方法来设置。我对服务器或Unix命令没有太多经验,所以这个解释是从那个角度来的。
一个非常重要的第一步是,您需要在本地机器和远程服务器上安装Git,以便运行下面的命令。大多数教程都会解释这一点,并且非常容易完成。http://www.git-scm.com是我下载本地机器安装程序的地方。该网站还提供了有关如何在远程服务器上安装的信息。
另外要注意的一件事是,我正在使用一台运行MAMP的Mac作为我的本地机器,而我的远程服务器是Ubuntu Linux 10.04.1。
步骤1 - 设置本地存储库
这可以通过多种方式完成。可以通过命令行或Git应用程序(如SourceTree、Tower、GitX等)来完成。我使用了一个应用程序,因为这是我计划使用Git的方式。
步骤2 - 设置远程存储库
$ mkdir website.git && cd website.git
$ git init --bare

第一行 - 在您的远程机器上创建一个目录并进入该目录。
第二行 - 在 website.git 目录中创建裸仓库。请注意,website.git 可以是任何您希望带有 .git 扩展名的名称。请参阅VonC关于裸仓库的描述。
步骤三 - 这一步使我最困惑。
$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f
$ chmod +x hooks/post-receive

第一行 - 这只是创建一个目录,它将成为您的网站根目录。如果您已经设置了一个用于您的Web服务器根目录的目录,则可以不需要执行此操作。如果您已经设置了Web根目录,请跳过此步骤。
第2-4行 - 这是我的第一个障碍。此命令将显示文件post-recieve包含的内容。您可以通过FTP连接到远程服务器上的此文件或从命令行进行编辑。最终,我只是在文本编辑器中进行了编辑,并通过FTP将其保存回服务器。对我来说更容易。此文件可以在步骤2中创建的目录website.git/hooks/post-receeive.sample中找到。
您还会注意到,实际名称的文件末尾有“.sample”。您需要将其重命名为没有扩展名的文件。这将基本上打开钩子。新文件名应该是post-receive 打开文件,您应该会发现以下文本。
#!/bin/sh
#
# An example hook script for the "post-receive" event.
#
# The "post-receive" script is run after receive-pack has accepted a pack
# and the repository has been updated.  It is passed arguments in through
# stdin in the form
#  <oldrev> <newrev> <refname>
# For example:
#  aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
#
# see contrib/hooks/ for a sample, or uncomment the next line and
# rename the file to "post-receive".

#. /usr/share/doc/git-core/contrib/hooks/post-receive-email

这些行被注释掉了,所以它们不会造成任何影响。你可以删除这些行,或者保留并在注释行下面添加以下内容。完成后,请将文件保存回远程服务器。
#!/bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f

第五行 - 这将确保 post-receive 文件的文件权限在服务器上是可执行的。这是一个让我们确定的步骤,以免以后出现问题。
第四步 - 添加远程并推送本地主分支
这一步可以通过命令行或我之前提到的 Git 应用程序之一完成。我使用其中一个应用程序。对我来说,这样更容易,而且我是服务器和 Unix 命令的新手。好处是你可以同时使用应用程序和命令行。所有内容都记录到 git 存储库中,两者都会看到相同的内容。使用你最熟悉的工具。大多数人会告诉你学习一些基本的命令行知识,这不是一个坏主意。
第五步 - 在本地机器上创建分支。
当你满意更改后,请将它们合并到主分支并将其推送到远程分支。你的网站现在将被更新,并应反映出你添加的任何新更改。
就是这样。这就是让我开始运行的东西。希望这有所帮助,我写的没有太多错误。

当我进行初始的git push时,我遇到了一个错误“git deploy remote: fatal: You are on a branch yet to be born”。我修改了post-receive脚本以包括一个分支GIT_WORK_TREE=/path/to/web/root git checkout branch_name -f。在第一次push后,git会报告“remote: Already on 'branch_name'”,因此您可以恢复到之前的状态。 - Chris

2
一个裸的Git repo是没有工作树(即没有任何文件)的。
因此,将代码推送到裸仓库不会改变您的Web根目录。
但是,您可以向该裸仓库添加一个 post-receive 钩子,该钩子将检出该裸仓库的内容到您的Web根目录,并更新其文件。
有许多示例说明了这种技术,例如“git GIT_WORK_TREE post-receive hook deployment remote”。

http://stackoverflow.com/a/7225398/6309 和 https://dev59.com/-W035IYBdhLWcg3wQtkg#5534486 也很有趣。设置 GIT_WORK_TREE 是必须的,才能正确运行检出。 - VonC

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