Как мне проверить файлы для сборки с помощью git? - PullRequest
5 голосов
/ 29 января 2010

Я использую git для управления моим проектом Grails. Я установил git-репозиторий на удаленном сервере, и я хочу, чтобы когда я работал с кодом локально, я хотел зафиксировать его и отправить на удаленный сервер. Я хочу, чтобы обновленный файл groovy и файлы gsp были помещены в нужное место на удаленном сервере, чтобы Grails воспринял изменения для удаленного тестирования. Возможно ли это?

Ответы [ 3 ]

6 голосов
/ 29 января 2010

Если вы продвигаетесь к удаленному репо, где «кажется, что он содержит только большой упаковочный файл, а не исходный код» (как вы подробно описали в комментариях), это должно означать « голое репо", что хорошо для этого, позволяет вам перемещаться без риска различий между рабочим деревом и данными git.

Затем, как описано в " Могу ли я использовать git для поддержания удаленного сервера в актуальном состоянии? ", другое (не голое) репо и post-update hook на стороне чистого репо получат вас где ты хочешь.


OP TripWired добавляет:

Хорошо, я сделал следующее:

  • создать голое РЕПО для регистрации, затем
  • Я создал еще одно стандартное репо, в основном у меня есть ~/project.git и ~/project.
  • Я клонировал project.git в project и в project.git/hooks/post-update Я положил:

    cd ../../project 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
5 голосов
/ 29 января 2010

Что касается вашего комментария к сообщению Алоса: удаленный - это то, что называется пустым репозиторием - он содержит весь репозиторий, за исключением извлеченной копии содержимого. Идея состоит в том, что для центральных репозиториев, которые вы просто извлекаете, нет необходимости иметь файлы.

Тем не менее, есть много подходов, чтобы делать то, что вы пытаетесь сделать.

  • Вы можете создать еще один удаленный не обнаженный клон, и использовать его, чтобы вытащить из обнаженного и провести тестирование. Это, наверное, проще всего.

  • Вы можете напрямую извлекать файлы (используя git read-tree и git checkout-index) из простого репозитория (пример приходит на ум, git.git's install-doc-quick.sh ) ,

  • Вы даже можете использовать не обнаженный пульт, но имейте в виду, что вставка в обнаженное хранилище опасна, поскольку рабочее дерево не обновляется. В зависимости от вашей версии git, существуют различные меры безопасности, которые вам придется переопределить, и вам нужно будет исправить рабочее дерево после нажатия (git reset --hard, вероятно).

Независимо от того, какой подход вы используете, предполагая, что вы хотите запускать свои тесты после каждого нажатия, вы можете использовать ловушку после получения или после обновления , чтобы сделать это. (Вы можете проверить, сколько времени прошло с момента последнего теста, если вы хотите избежать повторных тестов из-за всплесков толчков)

0 голосов
/ 29 января 2010

Если вы работаете в Linux, вы можете настроить задачу cron для копирования файлов для вас, или если вы работаете в Windows, вы можете создать запланированное задание с помощью небольшого сценария bat или vbs для копирования файла на удаленный сервер. Если вам нужна помощь по использованию Git, вот руководство пользователя. Если это не то, что вы ищете, мы можем поработать над чем-то, что может работать лучше, или если вам нужна помощь со скриптами, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...