Git:有没有办法自动推送子树?

jjj*_*jjj 5 git githooks git-subtree

我有一个在本地网络上维护的大型私有存储库。我想自动将该存储库的子树推送到该网络之外。我需要它很简单:

*任务*某人推送到本地远程存储库 --> 子树会自动推送到其他某个存储库

我不确定这是否可以通过服务器端挂钩来实现,因为 AFAIK 没有从裸遥控器推送子树这样的事情。我想出了两个想法:

  • 我可以在服务器上克隆远程并自动拆分克隆远程中的子树。这并没有真正的帮助,因为我不知道如何自动拉取子树(其他人也有这个问题)。
  • 另一个想法是编写一个自定义客户端post-commit-hook并让每个用户都安装它,但这很糟糕,不是吗?Git book 特别指出应该在服务器端强制执行策略

有没有一种简单的方法可以实现这样的目标?或者这是不可能的,这只是 git 滥用?

jjj*_*jjj 3

嗯,我有点尴尬。显然这比我想象的要容易得多。这是一个基于@wrzasa建议的仓促解决方案:

  1. 在您要推送到的服务器上克隆您的存储库,如下所示(dir.git 是一个裸存储库):

    .
    |- dir.git
    |- dir
    
    Run Code Online (Sandbox Code Playgroud)
  2. dir做:git remote add <remote-name> <remote-address>

  3. 输入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>
    
    Run Code Online (Sandbox Code Playgroud)

    记住要使post-receive可执行。如果您想知道为什么需要,请参阅此答案。unset GIT_DIR

差不多就这样了。现在,每当有人推送到dir远程(即dir.git)下的子树时<subdir-in-dir>,都会将其推送到<remote-name>