Экспорт измененных и добавленных файлов из чистого репо без рабочего дерева в каталог для компиляции или развертывания - PullRequest
2 голосов
/ 20 апреля 2019

У меня есть пустое хранилище, в которое разработчики помещают свои ветки исправлений из локального хранилища в Windows. Когда ветка нажата, я запускаю ловушку, чтобы построить их изменения в Linux. Это легко сделать, если я создаю рабочее дерево для ветви. Однако репо содержит десятки тысяч файлов, и наличие веток исправлений каждого разработчика создает рабочее дерево для всех объектов, когда они вносят изменения только в несколько объектов, - это огромная трата времени и ресурсов файловой системы.

Есть ли способ позволить разработчикам подтолкнуть к голому репозиторию, а затем в хуке извлечь только измененные источники в структуру каталогов, чтобы я мог иметь эффективный процесс сборки?

Идеи? * * 1005

Пример developer_a отправляет свою ветвь HF1, которая была разветвлена, из ветки Dev обратно в удаленное репозиторий на сервере сборки Linux.

В хуке, если я выполняю "git diff" HF1 и ветку dev, я вижу список файлов, которые были изменены.

diff-tree -r --no-commit-id - name-only HF1..dev

/ APP / SOURCE / Program1.cbl

Любая попытка использовать этот файл в приведенной выше команде не удалась, потому что рабочее дерево не существует.

Я хотел бы сгенерировать этот diff и затем извлечь из репозитория файлы, перечисленные в diff, в целевой каталог.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Вот сценарий пост-получения, который я написал, чтобы исключить необходимость использования веткой рабочего дерева для сборки, вызванной отправкой ветки на сервер сборки. Этот скрипт выполняет следующие действия:

  • Определяет толкаемую ветвь.
  • Идентифицирует измененные исходные компоненты.
  • Создает дерево сборки в определенной среде сборки.
  • Заполняет дерево сборки и запускает компиляцию и развертывание.

Если есть общие компоненты, такие как включаемые файлы, тогда ветви master и dev требуют рабочего дерева. При необходимости среда сборки объединит эти включаемые каталоги.

Команда dev будет отличаться от главного репо, в то время как ветви пользователей, которые были разветвлены от ветви dev, будут отличаться от dev.

крюк после получения

#!/bin/bash
###########################################################################

function get_files {
# determine the changed files and extract them from the repo to the build structure.
    git diff-tree -r ${ORIGIN}..${BRANCH} |
        while IFS= read -r line
        do
        COMMIT_ID=$(echo $line | cut -f4 -d" " )
        SOURCE=$(echo $line | cut -f6 -d" " )
            echo "Identified: " ${SOURCE} " Commit: " ${COMMIT_ID}
        TARGET=$(basename ${SOURCE})
        echo "Target : " ${TARGET}  
        echo ${TARGET} >> ${BUILD_PATH}/etc/build.txt

        echo "Extracting source from repo: " $SOURCE
        git show ${COMMIT_ID} > ${BUILD_PATH}/${SOURCE}
    done
}

function build_targets {
    FILES=$(cat ${BUILD_PATH}/etc/build.txt)
    for i in $FILES
    do
        echo "Compiling: " $i
    done
}

function prep_build_tree {
#Check if build structure exists
        if [[ -d ${BUILD_PATH} ]]
        then
# clean source from the local build structre by removing and rebuilding it
            echo "Cleaning old build structure"
            find ${BUILD_PATH} -type f -exec rm -v {} \;
        else
# Create build structure
            echo "Creating build structure"
            mkdir -p ${BUILD_PATH}/APP/SOURCE
            mkdir -p ${BUILD_PATH}/APP/COPY
            mkdir -p ${BUILD_PATH}/etc
            mkdir -p ${BUILD_PATH}/LOADLIB
        fi
}

##############################################################################

read oldrev newrev refname
echo "Old revision: $oldrev"
echo "New revision: $newrev"
echo "Reference name: $refname"

BASE_DIR=/home/mfcobol/SDLC/BUILD/Dev-Build
BRANCH=$(basename $refname)

#determine build type:
#   dev branch performs build using the dev build structure checked against master
#       other branches perform local builds for that branch only checked against dev.
case $BRANCH in

    dev ) BUILD=dev 
        echo "Dev build identified: Branch: "${BRANCH} 
        ORIGIN=master
        BUILD_PATH=${BASE_DIR}/${BUILD}/${BRANCH}
        prep_build_tree
        get_files
        build_targets ;;


    * )   BUILD=user
        echo "User build identified: Branch: "${BRANCH}
        ORIGIN=dev
        BUILD_PATH=${BASE_DIR}/${BUILD}/${BRANCH}
        prep_build_tree
        get_files
        build_targets ;;
esac
1 голос
/ 20 апреля 2019

Я хотел бы сгенерировать этот diff и затем извлечь из репозитория файлы, перечисленные в diff, в целевой каталог.

Это похоже на то, что Git уже делает изначально когда он извлекает ветку в рабочем дереве, уже настроенном для данного коммита.

Если ваше рабочее дерево сборки находится на определенном коммите, хук может вызвать git checkout новогоSHA1 нажал: рабочее дерево обнаружит изменения и само обновится (посредством git checkout, запускаемой ловушкой post-receive), чтобы обновить только то, что нужно.

...