Я использую мерзавца для управления проектом чаш Грааля, который я имею. Я открыл репозиторий мерзавца на удаленном сервере и что я хочу сделать, когда у меня есть код, работающий локально, я хочу передать его и нажатие к удаленному серверу. Я хочу, чтобы обновленный отличный файл и gsp's был помещен в правильное пятно на удаленном сервере так, чтобы чаши Грааля взяли изменения для удаленного тестирования. Действительно ли это возможно?
Если вы нажатием в удаленный репо, где «кажется, только содержит большой файл Pack, нет фактического исходного кода» (как вы подробно описаны в комментариях), что должно означать » Голая репо », что хорошо для него позволяет вам подтолкнуться без какого-либо риска различий между рабочим деревом и данными GIT.
Тогда, как описано в «, могу ли я использовать Git, чтобы сохранить удаленный сервер в настоящее время? », другой (неповторимый) REPO и крюк после обновления
Голая сторона репо, доставит вас туда, куда вы хотите.
OP Trackwired добавляет:
Хорошо, так что я сделал:
~ / project.git
и ~ / проект
. I клонировал Project.git
в проекте в
и в Project.GIT / Cooks / Post-Update
Я поставил:
CD ..// ./проект Env -i Git Checkout. Env -i Git Pull
Я также убедился, что после обновления был исполняемым.
Когда я запускаю крючок из командной строки, это работает нормально, но, похоже, не работает, когда я делаю регистрацию в репо.
Я согласен с шагами 1 и 2, но затем использовал этот скрипт , как в этот вопрос .
Проверьте, работает ли он с помощью Git Push
из вашего локального репо к своему горючему репо.
#!/bin/sh
#
# This hook does two things:
#
# 1. update the "info" files that allow the list of references to be
# queries over dumb transports such as http
#
# 2. if this repository looks like it is a non-bare repository, and
# the checked-out branch is pushed to, then update the working copy.
# This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".
git-update-server-info
is_bare=$(git-config --get --bool core.bare)
if [ -z "$is_bare" ]
then
# for compatibility's sake, guess
git_dir_full=$(cd $GIT_DIR; pwd)
case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi
update_wc() {
ref=$1
echo "Push to checked out branch $ref" >&2
if [ ! -f $GIT_DIR/logs/HEAD ]
then
echo "E:push to non-bare repository requires a HEAD reflog" >&2
exit 1
fi
if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
then
wc_dirty=0
else
echo "W:unstaged changes found in working copy" >&2
wc_dirty=1
desc="working copy"
fi
if git diff-index --cached HEAD@{1} >/dev/null
then
index_dirty=0
else
echo "W:uncommitted, staged changes found" >&2
index_dirty=1
if [ -n "$desc" ]
then
desc="$desc and index"
else
desc="index"
fi
fi
if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
then
new=$(git rev-parse HEAD)
echo "W:stashing dirty $desc - see git-stash(1)" >&2
( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
git-update-ref --no-deref HEAD HEAD@{1}
cd $GIT_WORK_TREE
git stash save "dirty $desc before update to $new";
git-symbolic-ref HEAD "$ref"
)
fi
# eye candy - show the WC updates :)
echo "Updating working copy" >&2
(cd $GIT_WORK_TREE
git-diff-index -R --name-status HEAD >&2
git-reset --hard HEAD)
}
if [ "$is_bare" = "false" ]
then
active_branch=`git-symbolic-ref HEAD`
export GIT_DIR=$(cd $GIT_DIR; pwd)
GIT_WORK_TREE=${GIT_WORK_TREE-..}
for ref
do
if [ "$ref" = "$active_branch" ]
then
update_wc $ref
fi
done
fi
Если вы находитесь в Linux, вы можете настроить задание CRON, чтобы скопировать файлы для вас, или если вы находитесь в Windows, вы можете создать запланированную задачу с помощью небольшого сценария BAT или VBS, чтобы скопировать файл на удаленный сервер. Если вам нужна помощь по использованию Git, здесь руководство пользователя. Если это не то, что вы ищете, мы можем работать над то, что может работать лучше или если вам нужна помощь с скриптами, дайте мне знать.
Относительно вашего комментария к сообщению Алоса: удаленный - это так называемый чистый репозиторий - он содержит весь репозиторий, за исключением извлеченной копии содержимого. Идея состоит в том, что для центральных репозиториев, которые вы просто нажимаете и извлекаете, файлы не нужны.
Тем не менее, существует множество подходов к тому, что вы пытаетесь сделать.
Вы можете создать еще один удаленный клон, не являющийся голым, и использовать его для извлечения из него и проведения тестирования. Это, наверное, самый простой способ.
Вы можете напрямую извлекать файлы (используя git read-tree
и git checkout-index
) из чистого репозитория (на ум приходит пример git.git ) install-doc-quick.sh ).
Вы даже можете использовать удаленный пульт, но помните, что вставка в репозиторий без него опасна, поскольку рабочее дерево не обновляется. В зависимости от вашей версии git существуют различные меры безопасности, которые вам придется переопределить, и вы исправите дерево работы после нажатия ( git reset --hard
, вероятно).
Независимо от того, какой подход вы выберете, предполагая, что вы хотите запускать тесты после каждого нажатия, вы можете использовать для этого ловушку post-receive или post-update . (Вы можете попросить его проверить время, прошедшее с момента последнего теста, если вы хотите избежать повторных тестов из-за серии толчков)