Git: есть ли способ автоматически толкать поддерево?
У меня есть большой частный репозиторий, который поддерживается в локальной сети. Я бы хотел автоматически вытолкнуть поддерево этого репозитория за пределы этой сети. Мне нужно, чтобы это было просто:
*Задача* кто-то толкает в локальный удаленный репозиторий -- > поддерево автоматически толкается в какой-то другой репозиторий
Я не уверен, что это может быть достигнуто с помощью Хука на стороне сервера, потому что AFAIK нет такой вещи, как выталкивание поддеревьев из голых пультов. Я поднялся наверх. с двумя идеями:
- я мог бы клонировать пульт на сервере и автоматически разделить поддерево в клонированном пульте. Это не очень помогает, потому что я не знаю, как автоматически вытягивать поддерево (у других также есть Эта проблема).
- Еще одна идея-написать пользовательский клиентский интерфейс
post-commit-hook
и заставить каждого пользователя установить его, но это ужасно, не так ли? В книге Git конкретно говорится, чтополитики должны применяться на стороне сервера .
Существует ли простой способ достичь чего-то подобного? Или это невозможно, и это просто жестокое обращение с мерзавцами?
1 ответ:
Ммм, я немного смущен. Очевидно, это оказалось гораздо проще, чем я думал. Вот поспешное решение, которое основывается на предложении @wrzasa :
Клонируйте свой репозиторий на сервере, к которому вы направляетесь, вот так (реж.git-это голое РЕПО):
. |- dir.git |- dir
В
dir
do: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
является необходимый.Вот и все. Теперь всякий раз, когда кто-то нажимает на
dir
удаленное (т. е.dir.git
) поддерево под<subdir-in-dir>
будет нажиматься на<remote-name>
.