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

标签 git githooks git-subtree

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

*任务* 有人推送到本地远程仓库 --> 一个子树被自动推送到其他仓库

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

  • 我可以在服务器上克隆远程并自动拆分克隆远程中的子树。这并没有真正的帮助,因为我不知道如何自动 pull 出子树(其他人也有 this problem )。
  • 另一个想法是编写一个自定义客户端post-commit-hook并让每个用户都安装它,但这很糟糕,不是吗? Git book 明确指出 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可执行。见 this answer如果你想知道为什么unset GIT_DIR是需要的。

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

    关于Git:有没有办法自动推送子树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714487/

    相关文章:

    git:在工作副本之间推送的简单解决方案

    git - 为现有的 pull 请求做出贡献

    git - 我需要签名的提交,但我需要禁用对 refs/notes/commits 的签名

    git - 不能使用 git subtree pull

    git - 对分包商 stash git 存储库的内容

    git - 如何添加另一个 git 存储库的子目录?

    sql - Azure ASP.Net MVC 数据库部署最佳实践

    python - 如何知道是否不在终端/命令行中调用 git hook

    bash - 从通过 post-receive 钩子(Hook)创建的 ssh session 调用时,导出不起作用

    git - 我将如何在 Git 中编写预 merge Hook ?