推送Git源代码树,而不仅仅是存储库。

5

我在错误地使用 Git,希望能正确使用它。

这是我的情况:

在我的开发机上有一个 Git 仓库,我提交代码并在其上进行测试。

另外,在我的 Web 服务器上有一个裸的 Git 仓库,我可以通过 SSH 推送代码到该仓库,从而部署应用。

我想实现的是,始终可以查看包含最新代码版本(某个分支或标签)的 Git 仓库。

我可以在 Web 服务器上创建另一个非裸的 Git 仓库,并在每次推送后手动执行 pull 操作,但我希望避免每次 git push 都要登录到 Web 服务器。

是否有一种方法可以远程“推送到 Web 服务器并刷新其已检出的文件,前提是我承诺没有在 Web 服务器上修改任何文件”?

或者我做法太错了,需要您给我一个耳光? :-)

3个回答

7
我通常会创建一个非裸仓库,并在其中添加一个名为“.git/hooks/post-receive”的文件,其内容如下:
#!/bin/sh
cd ..
env -i git reset --hard

这个文件必须是可执行的,并且必须检出一个分支。

然后,每次你推送到该仓库时,工作树将重置为当前分支的最新版本。任何本地更改都将被覆盖(但未跟踪的文件不会被删除)。

现在,Git在你推送到已检出分支时会显示警告(并在将来的发布中拒绝它)。为了避免这种情况,你可以在远程仓库上设置此配置:

git config receive.denyCurrentBranch ignore

您可以在这个代码库上工作,但是在提交之前必须要保存您的更改。我在这里找到了一个提示:http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

7

您可能需要使用 钩子

您可以创建一个 post-receive 钩子,它将在每次推送后在服务器上执行。 然后,在第二个裸仓库上执行拉取操作,您将始终保持最新状态 :)


1
我使用一个裸仓库(在用户帐户内)和一个共享仓库作为网站的根目录。
裸仓库有一个 post-update 钩子来拉取网站根目录,所以在推送到仓库后,网站根目录将被拉取。
为了从 Web 服务器获得读写访问权限,我的 Git 用户也属于 www-data 组,并且网站根目录已经 chmod ug+rwx,g+s,因此新创建的文件将获得组所有权。umask 确保组具有读写访问权限,因为 Git 使用默认的 umask,通常是 0022(文档中提到可以在配置中使用自己的 umask,但这对我从未起作用)。
#!/bin/bash
# post-update hook

WEB_DIR="/var/www/myweb"
pushd $WEB_DIR > /dev/null
export GIT_DIR="$WEB_DIR/.git"
umask 0007
git pull
popd > /dev/null

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