如何编写Git Hook实现推送后触发其他机器仓库自动拉取?是否需第三方工具?
Git Hook实现推送后自动拉取的方案
嘿,刚好之前折腾过类似的需求,给你详细拆解一下:
首先回答你的第二个问题:完全不需要第三方软件,Git自带的Hook机制加上简单的Shell脚本就能搞定,不过要分「同一机器的仓库」和「跨机器的仓库」两种场景来处理,下面分别说明:
场景一:同一机器下,推送后自动拉取另一个本地仓库
这种情况最直接,用Git的post-push本地Hook就行——这个Hook会在你执行git push成功完成后自动触发。
操作步骤:
- 打开你日常用来推送的本地仓库,进入
.git/hooks目录(这个目录默认有一堆.sample后缀的示例文件,不用管它们) - 创建一个名为
post-push的文件(注意不要加任何后缀),然后把下面的脚本粘贴进去,记得把/path/to/your/target/repo替换成你要自动拉取的那个仓库的绝对路径:
#!/bin/bash # 切换到目标仓库目录,切换失败就退出脚本 cd /path/to/your/target/repo || exit # 拉取远程分支的最新代码,把main换成你的实际分支名(比如master) git pull origin main
- 给这个脚本添加执行权限,否则Git不会执行它:
chmod +x .git/hooks/post-push
这样以后你在这个仓库执行git push成功后,脚本就会自动帮你拉取目标仓库的最新代码了。
场景二:跨机器,推送后远程机器的仓库自动拉取
这种情况需要用到远程仓库的服务器端Hook,因为本地的Hook没法直接操作远程机器。我们用post-receive Hook——这个Hook会在远程仓库接收到推送请求并处理完成后触发。
前提准备:
- 你需要能通过SSH无密码登录到远程机器(不然拉取时需要手动输密码,自动流程就卡住了)。可以生成SSH密钥对,把本地的公钥添加到远程机器的
~/.ssh/authorized_keys文件里来实现无密码登录。 - 确保远程机器上的目标仓库是干净的(没有未提交的修改),否则自动拉取可能会失败。如果是用裸仓库来接收推送,那还需要在脚本里指定工作目录。
操作步骤:
- 登录到远程机器,找到用来接收推送的仓库(可以是裸仓库,也可以直接是目标仓库),进入它的
.git/hooks目录 - 创建一个名为
post-receive的文件(同样不要加后缀),粘贴下面的脚本,替换路径和分支名:
#!/bin/bash # 切换到远程机器上的目标仓库目录 cd /path/to/remote/target/repo || exit # 拉取最新代码 git pull origin main # 如果你的远程接收仓库是裸仓库,需要用下面的命令来更新工作区: # git --work-tree=/path/to/remote/target/repo checkout -f main
- 给脚本添加执行权限:
chmod +x .git/hooks/post-receive
现在当你从本地推送到这个远程仓库时,post-receive Hook就会自动在远程机器上拉取最新代码到目标仓库了。
另一种跨机器方案:本地Hook远程执行命令
如果你不想修改远程仓库的Hook配置,也可以在本地的post-push Hook里通过SSH直接远程执行拉取命令,脚本如下:
#!/bin/bash # 替换成你的远程机器用户名、IP和目标仓库路径 ssh your-user@remote-ip "cd /path/to/remote/target/repo && git pull origin main"
这种方式同样需要SSH无密码登录,好处是不用碰远程仓库的配置,适合临时需求或者没有远程仓库管理权限的情况。
注意事项:
- 脚本里的路径一定要用绝对路径,因为Hook执行时的工作目录可能不是你预期的,用相对路径容易出错。
- 如果遇到权限问题,检查一下执行Git的用户对目标仓库有没有读写权限。
- 自动拉取场景下,尽量保证目标仓库没有未提交的修改,否则可能会导致拉取冲突,需要手动处理。
内容的提问来源于stack exchange,提问作者Davis8988
相关产品推荐
相关产品推荐

