Как проверить подкаталог git repo в текущем каталоге?

Существует удаленное репо с структурой каталогов:

-directory1
    -file1_1
    -file1_2
    ...
-directory2
    -file2_1
    -file2_2
    ...

У меня есть папка на веб-хостинге с пользовательским именем, например, "/path/public_html".

Как настроить git на веб-хостинге, поэтому мой "public_html" отслеживает подкаталог "directory2" удаленного репо?

Итак, другими словами, я хочу выполнить некоторую форму команды git на веб-хостинге и обновить public_html до последнего содержимого "directory2". Я не забочусь о возвращении к репо с веб-хостинга, если это помогает.

Ответ 1

Вы не можете клонировать непосредственно контент directory2, только directory2 и его содержимое, что означает, что на вашем диске всегда есть папка directory2/.

Если вы хотите видеть directory2 контент в public_html (то есть не public_html/directory2/...), вам нужна символическая ссылка.

При этом вы можете клонировать и проверять только directory2 папку, а не клонировать полное репо, как описано в разделе "Возможно ли разрешить проверку без проверки сначала из всего хранилища?

То есть:

git init /a/path
cd /a/path
git config core.sparseCheckout true
git remote add -f origin /url/remote/repo
echo "directory2/" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

Это даст папку a/path/directory2, чем ваш public_html может symlink to.

Если наличие папки directory2 в public_html не беспокоит вас, вы можете повторить вышеуказанные команды в public_html вместо a/path.

Ответ 2

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

Ответ 3

Это простая работа git read-tree. Сделайте голой репозиторий git на веб-сервере в любом месте. Храните манифест aka index для того, что в вашем каталоге развертывания и обрабатывайте ваши обновления с помощью предварительного приема:

#!/bin/sh
while read old new ref; do [[ $ref = refs/heads/deploy ]] && {
    export GIT_INDEX_FILE=$GIT_DIR/deployment-manifest
    export GIT_WORK_TREE=/path/public-html
    git read-tree -um `git write-tree` $new:directory2 || exit 1
}; done

Затем нажмите то, что вы хотите развернуть, на ветку развертывания веб-сервера, например. git push server master:deploy

git read-tree загружает индекс, который является манифестом, список того, что было помещено в рабочую строку, из любого дерева в базе данных объекта репозитория. Он читает имя дерева, которое вы укажете в индекс. Это рабочая лошадка для проверки и reset и слияние, например, с опцией -um, которая обновляет рабочую строку для проверки или быстрого слияния. Вы можете хранить любые индексы, которые хотите, для любого контента, который вы хотите. Оболочки удобства содержат один индекс для одного набора контента и всегда обновляют ссылку с именем HEAD, чтобы соответствовать всем, с чем они работают, но это чисто условно.

Обратите внимание, что если какой-либо файл, развернутый таким образом, был изменен в дереве развертывания, git read-tree здесь и нажатие не будут выполнены, потому что git не будет перезаписывать контент, который у вас нет рассказал об этом.

Ответ 4

Мне не нужно возвращаться к репо с веб-хостинга

В этом случае вы можете использовать команду archive. Что-то вроде этого:

git archive --remote=remote_repo --format=tar branch_name  path/to/directory2 > /path/public_html/dir2.tar && cd /path/public_html && tar xvf dir2.tar