Автоматическая фиксация при изменении файла с SVN (или git) - PullRequest
3 голосов
/ 27 апреля 2011

Я пару дней читал и искал решение, но не нашел ничего подходящего для моих нужд.

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

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

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

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

Chris

Ответы [ 5 ]

5 голосов
/ 27 апреля 2011

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

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

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

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

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

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

2 голосов
/ 27 апреля 2011

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

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

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

2 голосов
/ 27 апреля 2011

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

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

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

2 голосов
/ 27 апреля 2011

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

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

0 голосов
/ 03 июля 2015

На сайте разработчика вы можете разработать один инструмент для поддержки этой вещи, вы можете увидеть ниже код, ниже код поможет вам, как сделать Auto Commit на 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;
            }
        }
    }

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

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