【问题标题】:Git: is there a way to auto push a subtree?Git:有没有办法自动推送子树?
【发布时间】:2018-03-24 16:18:12
【问题描述】:

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

*Task* 有人推送到本地远程仓库 --> 子树会自动推送到其他仓库

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

  • 我可以在服务器上克隆远程并自动拆分克隆远程中的子树。这并没有真正的帮助,因为我不知道如何自动拉取子树(其他人也有 this problem)。
  • 另一个想法是编写一个自定义客户端post-commit-hook 并让每个用户都安装它,但这很糟糕,不是吗? Git book 明确指出policies should be enforced on server side

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

【问题讨论】:

  • 你可以从一个裸远程仓库的 post-receive 钩子推送到另一个远程仓库,那有什么问题呢?
  • @wrzasa 嘿,谢谢你的提问。也许我没有把这部分说清楚:你能从裸遥控器推送 subtrees 吗?我想,由于在裸机上没有工作树之类的东西,因此您无法真正指定子树。 E:我编辑了问题以使其清楚
  • 没有使用子树,但你总是可以在你的钩子中检查你的 repo 到一个临时目录,然后做你需要的任何事情。
  • @wrzasa 谢谢,我不知道。我试试看。
  • 祝你好运!这里有一些钩子示例:digitalocean.com/community/tutorials/…

标签: git githooks git-subtree


【解决方案1】:

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

  1. 在你推送的服务器上克隆你的仓库,像这样(dir.git 是一个裸仓库):

    .
    |- dir.git
    |- dir
    
  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>
    

    记得让post-receive 可执行。如果您想知道为什么需要unset GIT_DIR,请参阅this answer

差不多就是这样。现在,每当有人推送到&lt;subdir-in-dir&gt; 下的dir 远程(即dir.git)子树时,都会被推送到&lt;remote-name&gt;

【讨论】:

  • 来自git subtree --help: --branch= [...] 必须不存在 所以我想你必须删除 在钩子程序结束时;我说的对吗?
  • @ardabro 我在文档中看不到您所指的行。你用的是哪个版本的 git?另外,我最终得到了一个不同版本的钩子,它基本上从裸仓库中提取,然后执行git subtree push --prefix=&lt;dir&gt; &lt;remote-name&gt; &lt;branch-name&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多