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

时间:2009-10-12 15:27:49

标签: git

我正在使用Git错误。我想正确使用它。

这就是我所拥有的:

在这里,我的开发机器上是一个Git存储库,我承诺并测试它。

那边是我的网络服务器 - 这个代码将被部署的地方。 Web服务器有另一个裸git存储库,当我准备好部署时,我可以通过SSH推送它。

我想要发生的是查看Git存储库,该存储库始终具有最新版本的源文件(在某些分支或某些标记上)。

我可以做的是在Web服务器上创建另一个(非裸)git存储库,并在每次推送后进行手动拉取,但我希望避免每次都必须登录到Web服务器我做了一个git push。

有没有办法远程“推送到网络服务器并刷新其签出的文件,如果我保证我没有编辑网络服务器上的任何文件”?

或者我只是这样做错了你想打我? : - )

3 个答案:

答案 0 :(得分:7)

hooks可能就是你要找的东西。

您创建了一个post-receive钩子。并且它会在你每次推动之后在服务器上执行。 然后你对第二个裸存储库进行了拉动,你将始终保持最新状态:)

答案 1 :(得分: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

答案 2 :(得分:1)

我将这些东西用于裸存储库(在用户帐户内)和作为网络根目录的共享存储库。
裸存储库有一个更新后的钩子来拉动Web根目录,因此在推送到存储库之后,将会拉动Web根目录。

要从网络服务器获得读/写访问权限,我的git-user也在www-data组中,而web根目录是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