Зафиксировать изменения папки в Subversion - PullRequest
1 голос
/ 23 марта 2011

У меня есть каталог, файлы которого могут меняться или не меняться каждый день во время автоматизированного процесса. В этом каталоге содержатся файлы MDL для разработчика хранилища Oracle, которые представляют отдельные сопоставления. Автоматизированный процесс оракула создает файлы MDL на основе того, какие сопоставления существуют в модуле оракула. Невозможно знать, какие файлы будет содержать каталог, до тех пор, пока не запустится процесс Oracle.

Мне нужно передать все файлы в каталоге в Subversion после того, как процесс заполнил папку. Если файл, существовавший вчера, исчез (поскольку отображение оракула больше не существует), этот файл также следует удалить из svn. Если в oracle было создано новое отображение, и поэтому в папку был добавлен новый файл, новый файл должен быть добавлен в svn. Если отображение изменилось, и поэтому новый файл был изменен, изменение должно быть зафиксировано в svn.

Все это должно происходить как часть автоматизированного процесса, поэтому необходимо использовать инструкции командной строки svn для синхронизации изменений папки с svn.

Существует ли простая команда svn (или последовательность команд), которая будет синхронизировать папку, а не файл с репозиторием svn?

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

Предположим, что у нас есть дерево папок, подобное этому:

.
├── autocommit.sh
├── dailysnapshot/
└── workingcopy/

dailysnapshot / хранит MDL-файлы, которые обновляются ежедневно.workingcopy / является вашей рабочей копией вашего хранилища subversion. Обратите внимание, что этот сценарий может фиксировать изменения только одного уровня под рабочей копией, если в рабочей копии есть подпапка, вам нужно улучшить сценарий.

Makecrontab, который запланирован так, как вы хотите вызвать autocommit.sh

Использование:

autocommit.sh [каталог снимков] [рабочий каталог] [имя пользователя svn] [пароль svn]

autocommit.sh source:

#!/bin/bash
SNAPSHOT=`cd $1;pwd`
WORKINGDIR=`cd $2;pwd`
USERNAME="$3"
PASSWORD="$4"

function CheckModifiedAndNew() {    
    cd $1
    for f in $(find .)
    do
    if [ -a $f ]; then
    f=${f:2}
        if [[ -n $f ]]; then
            SnapshotFile="$1/$f"
            WorkingFile="$2/$f"        
            if [[ -f $WorkingFile ]];then
                if cmp $SnapshotFile $WorkingFile &> /dev/null; then
                    # 2 files are identical
                    echo &> /dev/null "" #do nothing here
                else
                    echo "[Modified]  $WorkingFile"
                    cp -f $SnapshotFile $WorkingFile
                fi
            else
                cp -f $SnapshotFile $WorkingFile
                echo "[Added]     $WorkingFile"
                svn add $WorkingFile
            fi
        fi
    fi
    done
}

function CheckRemove() {
    cd $2
    for f in $(find .)
    do
    if [ -a $f ]; then
        f=${f:2}
        if [[ -n $f ]]; then
            SnapshotFile="$1/$f"
            WorkingFile="$2/$f"       
            if [[ -f $SnapshotFile ]];then
                echo &> /dev/null "" #do nothing here
            else
                echo "[Removed]   $WorkingFile"
                svn remove $WorkingFile
            fi
        fi
    fi
    done
}

function CommitAllChanges() {
    cd $1
    svn commit . --message="daily auto commit" --username=$USERNAME \
                                               --password=$PASSWORD \
                                               --non-interactive \
                                               --no-auth-cache                                               
}

CheckModifiedAndNew $SNAPSHOT $WORKINGDIR

CheckRemove $SNAPSHOT $WORKINGDIR

CommitAllChanges $WORKINGDIR

Настройте его так, чтобы оно соответствовало вашей проблеме.

1 голос
/ 23 марта 2011

Вы можете попробовать WebDav и autoversioning - то есть репозиторий Subversion, выставленный через «сетевой ресурс». Записывает и новые файлы будут добавлены в хранилище, я не уверен, что удаления будут обрабатываться тоже, но это не слишком реалистично, чтобы ожидать этого.

есть проблемы с WebDAV, о которых вы должны знать: он немного болтливый, он не фиксирует все файлы за один раз (так как каждый будет написан отдельно), но вы можете получить адекватные результаты из него.

Альтернативой является драйвер файловой системы, который делает репо практически таким же образом.

1 голос
/ 23 марта 2011

Простого решения не существует. Однако это задача, которую можно выполнить с помощью сценариев (например, с помощью bash).

Идея состоит в том, что у вас есть каталог экспорта (куда вы экспортируете файлы MDL из Oracle) и ваша рабочая копия SVN в другой каталог . Обновление выполняется в 2 этапа:

  1. Вы перебираете все файлы в вашей рабочей копии SVN и смотрите, существуют ли они в директории экспорта. Если файл существует в экспорте, вы просто перемещаете его в свой рабочий каталог svn, если не вы svn удаляете файл в рабочей копии.
  2. Все остальные файлы в каталоге экспорта являются новыми. Переместите их в рабочую копию svn, а затем просто svn добавьте их.

После этого вы фиксируете эти изменения ( svn commit ). Это не должно быть слишком сложно реализовать в скрипте.

...