Git: 有没有办法自动推送子树?
Git: is there a way to auto push a subtree?
我有一个在本地网络上维护的大型私有存储库。我想自动将该存储库的子树推送到该网络之外。我需要它很简单:
*Task* 有人推送到本地远程仓库 --> 子树自动推送到其他仓库
我不确定这是否可以通过服务器端挂钩实现,因为 AFAIK 没有从裸远程推送 子树 这样的东西。我想到了两个想法:
- 我可以在服务器上克隆遥控器并自动拆分克隆的遥控器中的子树。这并没有真正帮助,因为我不知道如何自动拉子树(其他人也有 this problem)。
- 另一个想法是编写自定义客户端
post-commit-hook
并让每个用户都安装它,但这很糟糕,不是吗? Git 书中明确指出 policies should be enforced on server side.
有没有一种简单的方法可以实现这样的目标?或者这是不可能的,只是 git 滥用?
嗯,我有点不好意思。显然这比我想象的要容易得多。这是一个基于 @wrzasa 建议的草率解决方案:
在您要推送到的服务器上克隆您的存储库,就像这样(dir.git 是一个裸存储库):
.
|- dir.git
|- dir
在dir
中做:git remote add <remote-name> <remote-address>
在dir.git/hooks/post-receive
中输入:
#! /bin/bash
unset GIT_DIR
cd ../dir
git pull ../dir.git
git subtree split --prefix=<subdir-in-dir> --branch=<branch-name>
git push <remote-name> <branch-name>
记得使 post-receive
可执行。如果您想知道为什么需要 unset GIT_DIR
,请参阅 this answer。
差不多就这些了。现在每当有人推送到 dir
远程(即 dir.git
)时,<subdir-in-dir>
下的子树将被推送到 <remote-name>
.
我有一个在本地网络上维护的大型私有存储库。我想自动将该存储库的子树推送到该网络之外。我需要它很简单:
*Task* 有人推送到本地远程仓库 --> 子树自动推送到其他仓库
我不确定这是否可以通过服务器端挂钩实现,因为 AFAIK 没有从裸远程推送 子树 这样的东西。我想到了两个想法:
- 我可以在服务器上克隆遥控器并自动拆分克隆的遥控器中的子树。这并没有真正帮助,因为我不知道如何自动拉子树(其他人也有 this problem)。
- 另一个想法是编写自定义客户端
post-commit-hook
并让每个用户都安装它,但这很糟糕,不是吗? Git 书中明确指出 policies should be enforced on server side.
有没有一种简单的方法可以实现这样的目标?或者这是不可能的,只是 git 滥用?
嗯,我有点不好意思。显然这比我想象的要容易得多。这是一个基于 @wrzasa 建议的草率解决方案:
在您要推送到的服务器上克隆您的存储库,就像这样(dir.git 是一个裸存储库):
. |- dir.git |- dir
在
dir
中做:git remote add <remote-name> <remote-address>
在
dir.git/hooks/post-receive
中输入:#! /bin/bash unset GIT_DIR cd ../dir git pull ../dir.git git subtree split --prefix=<subdir-in-dir> --branch=<branch-name> git push <remote-name> <branch-name>
记得使
post-receive
可执行。如果您想知道为什么需要unset GIT_DIR
,请参阅 this answer。
差不多就这些了。现在每当有人推送到 dir
远程(即 dir.git
)时,<subdir-in-dir>
下的子树将被推送到 <remote-name>
.