Xpoint
   [напомнить пароль]

Принудительный checkout из CVS с overwrite всех конфликтов

Метки: [без меток]
2005-11-09 13:26:37 [обр] Дмитрий Котеров(0/912)[досье]

Есть некоторый CVS-модуль, содержащий данные сайта. Периодически запускается скрипт, который этот модуль выкачивает и выкладывает на сайт в DOCUMENT_ROOT, один-в-один.

Проблема заключается в том, что, если какой-то файл в DOCUMENT_ROOT случайно изменился (и он же обновился в CVS), то checkout не проходит - пишет, что возник конфликт, и не хочет выкладывать поверх.

Сколько я ни искал, я так и не смог найти в документации CVS опцию принудительного checkout-а с перезаписью всех изменений (и удалением того, чего в CVS нет). (Иными словами, этакое подобие rsync, когда в качестве источника используется CVS-репозиторий.) Она вообще есть?

P.S.

  1. "Случайно изменился" - означает "изменился нелегально". Например, в результате внезапной перезагрузки сервера или действия другой непреодолимой силы. Вручную там ничего меняться не должно, естественно. Достаточно ведь просто дату файла случайно поменять, и привет.
  2. Примем, что размер CVS-модуля - около 200 М. Поэтому производить выкладывание во временную чистую директорию, а затем перемещать ее на место DOCUMENT_ROOT, невозможно.
спустя 1 минуту [обр] Дмитрий Котеров(0/912)[досье]
Да, вот еще что. Если выснится, что в CVS такой возможности нет, есть ли она в Subversion?
спустя 1 час 8 минут [обр] Закиров Руслан(0/341)[досье]
В cvs есть ключ -C. Подходит?
пользуюсь svk(на базе svn) там можно с помощь svk revert -R .; svk update, значит можно и в svn.
спустя 11 минут [обр] Ярослав Сюзёв (yara)(0/305)[досье]
Дмитрий Котеров[досье]
Действительно, зачев вы пользуетесь checkout-ом, лучше update -C. Правда, придется вручную удалять локально модифицированные файлы, типа .#index.php.1.2. Подробнее про ключ -C см. cvs -H up.
спустя 1 день 5 часов [обр] Дмитрий Котеров(0/912)[досье]
Для справки:
C:\>cvs -H up
Usage: cvs.EXE update [-APCdflRp] [-k kopt] [-r rev] [-D date] [-j rev]
    [-I ign] [-W spec] [files...]
        -A      Reset any sticky tags/date/kopts.
        -P      Prune empty directories.
        -C      Overwrite locally modified files with clean repository copies.
        -d      Build directories, like checkout does.
        -f      Force a head revision match if tag/date not found.
        -l      Local directory only, no recursion.
        -R      Process directories recursively.
        -p      Send updates to standard output (avoids stickiness).
        -k kopt Use RCS kopt -k option on checkout. (is sticky)
        -r rev  Update using specified revision/tag (is sticky).
        -D date Set date to update from (is sticky).
        -j rev  Merge in changes made between current revision and rev.
        -I ign  More files to ignore (! to reset).
        -W spec Wrappers specification line.
спустя 4 минуты [обр] Дмитрий Котеров(0/912)[досье]

Да, вроде работает, однако 2 недостатка:

  1. Если файл изменился локально, он копируется под именем .#*, как было замечено выше. Можно ли это отключить?
  2. Если создать какой-нибудь файл локально (в репозитории его нет) и выполнить update -C, то он не удалится. Но зато cvs выдаст для него строку:
? имя_файла

Т.е. он его обнаружил, но не удалил. Можно ли заставить удалять все же?

спустя 12 часов [обр] Ярослав Сюзёв (yara)(0/305)[досье]
Дмитрий Котеров[досье]
Средствами CVS ни то, ни другое не вылечить, AFAIK. Раз уж вы запускаете апдейт по крону, то напишите скриптик, который будет удалять лишние файлы после апдейта.
спустя 2 часа 51 минуту [обр] Дмитрий Котеров(0/912)[досье]
Ну, не по крону, а вручную - но это дела не меняет.
Powered by POEM™ Engine Copyright © 2002-2005