Git: есть ли способ автоматически толкать поддерево?


У меня есть большой частный репозиторий, который поддерживается в локальной сети. Я бы хотел автоматически вытолкнуть поддерево этого репозитория за пределы этой сети. Мне нужно, чтобы это было просто:

*Задача* кто-то толкает в локальный удаленный репозиторий -- > поддерево автоматически толкается в какой-то другой репозиторий

Я не уверен, что это может быть достигнуто с помощью Хука на стороне сервера, потому что AFAIK нет такой вещи, как выталкивание поддеревьев из голых пультов. Я поднялся наверх. с двумя идеями:

  • я мог бы клонировать пульт на сервере и автоматически разделить поддерево в клонированном пульте. Это не очень помогает, потому что я не знаю, как автоматически вытягивать поддерево (у других также есть Эта проблема).
  • Еще одна идея-написать пользовательский клиентский интерфейс post-commit-hook и заставить каждого пользователя установить его, но это ужасно, не так ли? В книге Git конкретно говорится, чтополитики должны применяться на стороне сервера .

Существует ли простой способ достичь чего-то подобного? Или это невозможно, и это просто жестокое обращение с мерзавцами?

1 2

1 ответ:

Ммм, я немного смущен. Очевидно, это оказалось гораздо проще, чем я думал. Вот поспешное решение, которое основывается на предложении @wrzasa :

  1. Клонируйте свой репозиторий на сервере, к которому вы направляетесь, вот так (реж.git-это голое РЕПО):

    .
    |- dir.git
    |- dir
    
  2. В dir do: 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 является необходимый.

Вот и все. Теперь всякий раз, когда кто-то нажимает на dir удаленное (т. е. dir.git) поддерево под <subdir-in-dir> будет нажиматься на <remote-name>.