我正在使用Git错误。我想正确使用它。
这就是我所拥有的:
在这里,我的开发机器上是一个Git存储库,我承诺并测试它。
那边是我的网络服务器 - 这个代码将被部署的地方。 Web服务器有另一个裸git存储库,当我准备好部署时,我可以通过SSH推送它。
我想要发生的是查看Git存储库,该存储库始终具有最新版本的源文件(在某些分支或某些标记上)。
我可以做的是在Web服务器上创建另一个(非裸)git存储库,并在每次推送后进行手动拉取,但我希望避免每次都必须登录到Web服务器我做了一个git push。
有没有办法远程“推送到网络服务器并刷新其签出的文件,如果我保证我没有编辑网络服务器上的任何文件”?
或者我只是这样做错了你想打我? : - )
答案 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
您可以使用此存储库,但必须在对其进行任何推送之前提交更改。
答案 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