Автоматическая фиксация при изменении файла с помощью SVN (или git)?

#svn #git #continuous-integration

#svn #git #непрерывная интеграция

Вопрос:

Я читал и искал решение в течение нескольких дней, но не нашел ничего, что соответствовало бы моим потребностям.

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

Я рассматриваю решения типа непрерывной интеграции, в которых при обновлении «версионного» файла на промежуточном сервере он автоматически фиксируется в SVN.

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

Спасибо за любую помощь!

Крис

Комментарии:

1. Смотрите этот вопрос о программистах: Простой способ привлечь непрограммистов (т. Е. дизайнеров) к использованию контроля версий?

Ответ №1:

Мне действительно нравится, что вы сказали «улучшить процесс», потому что ответ там — да.

Пусть ваши дизайнеры и все остальные работают с репозиторием. Не имеет значения, выбираете ли вы SVN или git или что-то еще, но сделайте это «авторитетной» копией. Это в конечном итоге избавит вас от головной боли, поскольку у вас будет четкая история всех изменений, и вы всегда сможете вернуться.

Способ, которым я настроил несколько сред для магазинов веб-дизайна, — это система, противоположная той, что вы предлагаете, она работает следующим образом:

  • Все дизайнеры работают над извлеченными копиями сайтов и вносят изменения и фиксируют / обновляют по мере необходимости.
  • При фиксации репозиторий отправляет копию сайта на промежуточный сервер, который настроен почти идентично рабочему.
  • Если сайт работает на промежуточном этапе, существует очень высокая уверенность в том, что он будет работать на реальном сервере.
  • Когда все будет готово, копию сайта на промежуточном сервере можно скопировать в live, и теперь вы обновили свой сайт очень ответственным образом, и у вас есть история всех ваших изменений. (Для этого мне нравится использовать rsync, вы можете заставить его работать так, как считаете нужным)

Я надеюсь, это поможет вам немного подумать о вашем процессе.

Возвращаясь к вашему первоначальному вопросу: если вы действительно не хотите изменять свой процесс, вы могли бы настроить cron, который запускается каждые несколько минут и добавляет / фиксирует все измененные файлы, и это должно сработать. Но мне это не нравится, потому что теперь у вас нет значимых сообщений о фиксации, и история изменений также может не иметь смысла. Поскольку люди работают и сохраняют файлы, они не понимают, в какой момент они фиксируются, поэтому, скорее всего, в репозитории сейчас есть ревизии, которые находятся в нерабочем состоянии, и теперь, как вы находите ревизии, которые не повреждены? Выбор «автоматизировать» фиксацию, очевидно, не самое чистое решение.

Комментарии:

1. Да, это, похоже, лучший вариант. Это то, чем я занимался в другой компании, но потом меня раскрыли =) Надеюсь, дизайнеров можно убедить следовать этому, они будут использовать преимущества. Спасибо @ctcherry!

Ответ №2:

Я полагаю (хотя я этого не пробовал), что вы могли бы написать observer для watchdog ( http://packages.python.org/watchdog / ) это сделало бы фиксацию за вас.

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

Комментарии:

1. Да, я думаю, что собираюсь запустить процесс, описанный ctcherry.

Ответ №3:

Похоже, вы хотите использовать WebDAV для автозаполнения в Subversion. Subversion и WebDAV

Я уже использовал эту методологию раньше. Это приятно тем, что вы можете настроить его как общий сетевой ресурс Windows / Linux. Нетехнический специалист просто видит это как сетевой диск для хранения файлов. Всякий раз, когда пользователь сохраняет документ / файл там, он автоматически фиксируется.

У Git может быть что-то подобное, но у меня нет опыта работы с этим.

Ответ №4:

CruiseControl и другие инструменты, на которые я смотрел, этого не делают

Я бы позволил себе не согласиться. Если бы вам нужно было настроить <exec> блок для выполнения вызова инструментов командной строки SVN для фиксации кода за вас, разве это не сделало бы именно то, что вы просите? Вы можете использовать <filesystem> узел, чтобы определить, какие файлы были изменены.

Теперь, хотя вы могли бы это сделать, я тоже согласен с @ctcherry, что это может привести к принудительному запуску повреждающего кода, если вы сразу перейдете к производству с этим.

Ответ №5:

На сайте разработчика вы можете разработать один инструмент для поддержки этой вещи, вы можете увидеть приведенный ниже код, приведенный ниже код поможет вам выполнить автоматическую фиксацию в SVN, взгляните 🙂

Любые отзывы или вопросы, оставьте свой комментарий, мы можем обсудить это

Смотрите код здесь:

     public static string AppTitle = "Auto Commit";

    // AddFileToSVN
    public static bool AddFileToSVN(string strLogFile, string path, 
                                         Timer myTimer)
    {
        try
        {
            using (SharpSvn.SvnClient client = new SharpSvn.SvnClient())
            {
                Collection changeFiles = new 
                                Collection();
                client.GetStatus(path, out changeFiles);

                foreach (SharpSvn.SvnStatusEventArgs changeFile in 
                                                     changeFiles)
                {
                    if (changeFile.LocalContentStatus == 
                                       SharpSvn.SvnStatus.Missing)
                    {
                        client.Delete(changeFile.Path);
                        WriteLog(strLogFile, changeFile.Path   " Removed - 
                                 Missing files (that are not in filesystem)");

                        myTimer.Enabled = false;
                    }

                    if (changeFile.LocalContentStatus == 
                                     SharpSvn.SvnStatus.NotVersioned)
                    {
                        client.Add(changeFile.Path);
                        WriteLog(strLogFile, changeFile.Path   " Added - 
                                   This file is new in filesystem!");

                        myTimer.Enabled = false;
                    }
                }
                return true;
            }
        }
        catch (Exception ex)
        {
            myTimer.Enabled = true;
            WriteLog(strLogFile, ex);
            return false;
        }
    }

    // CommitToSVN
    public static bool CommitToSVN(string strLogFile, string workingcopy, 
                                          string message, Timer myTimer)
    {
        using (SharpSvn.SvnClient client = new SharpSvn.SvnClient())
        {
            SharpSvn.SvnCommitArgs args = new SharpSvn.SvnCommitArgs();

            args.LogMessage = message;
            args.ThrowOnError = true;
            args.ThrowOnCancel = true;

            try
            {
                myTimer.Enabled = true;
                return client.Commit(workingcopy, args);
            }
            catch (Exception ex)
            {
                myTimer.Enabled = true;
                WriteLog(strLogFile, ex);
                return false;
            }
        }
    }
  

посмотреть больше информации: здесь