Як експортувати історію редакцій з mercurial або git в cv?


100

Я буду працювати з іншими людьми над кодом з проекту, який використовує резюме. Ми хочемо використовувати розподілений vcs для того, щоб зробити свою роботу, і коли ми закінчуємо або, можливо, раз у раз ми хочемо ввести свій код і всю свою історію редагування в резюме. У нас немає доступу на запис до відеорепортажу проекту, тому ми не можемо здійснювати дуже часто. Який інструмент ми можемо використати, щоб експортувати свою історію редакцій у відеокліпи? В даний час ми думали про використання git або mercurial, але ми могли б використовувати інший розподілений vcs, якщо це може полегшити експорт.


Коли ви говорите "розподілений CVS", я думаю, що ви маєте на увазі "невдоволений VCS" або "DVCS", що означає "розподілену систему управління версіями".
Патрік МакЕлхані,

Я маю на увазі розподілену систему контролю версій.
tatsuhirosatou

Відповіді:


237

На щастя для тих із нас, хто все ще змушений використовувати CVS, git пропонує досить хороші інструменти для того, щоб робити саме те, що ви хочете зробити. Мої пропозиції (і що ми тут робимо на $ роботи):

Створення початкового клону

Використовуйте git cvsimportдля клонування історії ревізій CVS у сховище git. Я використовую таке виклик:

% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \
  -A /path/to/authors/file cvs_module_to_checkout

Цей -Aпараметр необов’язковий, але він допомагає зробити історію редагувань, імпортовану з CVS, більш схожою (див. man git-cvsimportДодаткову інформацію про те, як це налаштовано).

Залежно від розміру та історії сховища CVS, цей перший імпорт зайнять ДУЖЕ довго. Ви можете додати -v до вищевказаної команди, якщо ви хочете, щоб було спокійно, що щось насправді відбувається.

Після завершення цього процесу у вас з'явиться masterгілка, яка повинна відображати HEAD HEAD (за винятком того, що git cvsimportза замовчуванням ігнорує зобов’язання за останні 10 хвилин, щоб уникнути заповнення комісії, яка є напівзавершеною). Потім ви можете використовувати git logта друзів, щоб вивчити всю історію сховища так само, як ніби він використовував git з самого початку.

Налаштування конфігурації

Є кілька налаштувань конфігурації, які в майбутньому полегшать імпортний імпорт із CVS (а також експорт). Вони не задокументовані на сторінці git cvsimportman, тому я думаю, що вони можуть змінитися без попереднього повідомлення, але, FWIW:

% git config cvsimport.module cvs_module_to_checkout
% git config cvsimport.r cvs
% git config cvsimport.d $CVSROOT

Усі ці параметри можна вказати в командному рядку, щоб ви могли безпечно пропустити цей крок.

Зростання імпорту

Подальше git cvsimportмає бути набагато швидшим, ніж перше виклик. Однак це робиться cvs rlogу кожному каталозі (навіть у тих, у яких є лише файли Attic), тому це може зайняти кілька хвилин. Якщо ви вказали запропоновані конфігурації вище, все, що вам потрібно зробити, це виконати:

% git cvsimport

Якщо ви не налаштували ваші конфігурації для визначення за замовчуванням, вам потрібно буде вказати їх у командному рядку:

% git cvsimport -r cvs -d $CVSROOT cvs_module_to_checkout

У будь-якому випадку слід пам’ятати про дві речі:

  1. Переконайтеся, що ви знаходитесь у кореневому каталозі вашого сховища git. Якщо ви ще деінде, воно спробує зробити свіже, cvsimportщо знову візьме назавжди.
  2. Переконайтеся, що ви перебуваєте у своєму masterвідділенні, щоб зміни можна було об'єднати (або переоцінити) у ваші локальні / тематичні гілки.

Внесення місцевих змін

На практиці я рекомендую завжди вносити зміни до гілок і лише зливатися, masterколи ви готові експортувати ці зміни назад у сховище CVS. Ви можете використовувати будь-який робочий процес, який вам подобається у ваших гілках (злиття, повторне звільнення, розкручування тощо), але, звичайно, застосовуються стандартні правила перезавантаження: не перезавантажуйте, якщо хтось інший базував свої зміни на вашій гілці.

Експорт змін до CVS

git cvsexportcommitКоманда дозволяє експортувати одну фіксацію до сервера CVS. Ви можете вказати один ідентифікатор комісії (або що-небудь, що описує конкретну комісію, як визначено в man git-rev-parse). Потім генерується відмінність, застосовується до каси CVS, а потім (необов'язково) здійснюється до CVS за допомогою фактичного cvsклієнта. Ви можете експортувати кожну мікрокомісію у своїх галузях тем, але, як правило, мені подобається створювати поточну комісію для злиття masterта експортувати цю єдину комісію злиття в CVS. Коли ви експортуєте комісію злиття, ви повинні сказати git, який батьківський комітет комітету використовувати для створення розріз. Крім того, це не буде працювати, якщо ваше злиття було швидким вперед (див. Розділ "ЯК РОБОТИ РОБОТИ" man git-mergeдля опису швидкого злиття вперед), тому вам доведеться використовувати--no-ffваріант при здійсненні злиття. Ось приклад:

# on master
% git merge --no-ff --log -m "Optional commit message here" topic/branch/name
% git cvsexportcommit -w /path/to/cvs/checkout -u -p -c ORIG_HEAD HEAD

Ви можете побачити, що означає кожен із цих варіантів на сторінці man для git-cvsexportcommit . У вас є можливість встановити -wпараметр у вашому git config:

% git config cvsexportcommit.cvsdir /path/to/cvs/checkout

Якщо виправлення не вдасться з будь-якої причини, мій досвід полягає в тому, що вам, на жаль, буде краще скопіювати змінені файли вручну та здійснити використання клієнта cvs. Однак цього не повинно статися, якщо ви переконайтеся, що masterвін актуальний із CVS, перш ніж об’єднати галузь теми.

Якщо комісія не відповідає з будь-якої причини (проблеми з мережею / дозволами тощо), ви можете взяти команду, надруковану до вашого терміналу в кінці виходу помилки, і виконати її у вашій робочій директорії CVS. Зазвичай це виглядає приблизно так:

% cvs commit -F .msg file1 file2 file3 etc

Наступного разу, коли ви зробите git cvsimport(зачекавши не менше 10 хвилин), ви побачите, що патч вашої експортованої комісії повторно імпортується у ваше місцеве сховище. У них будуть різні ідентифікатори комісій, оскільки в CVS комісія буде інша часова марка та, можливо, інше ім'я виконавця (залежно від того, ви встановили авторський файл у своєму початковому cvsimportвище).

Клонування вашого клона CVS

Якщо у вас є кілька людей, які потребують цього cvsimport, було б ефективніше мати одне сховище git, яке виконує cvsimport, а всі інші сховища створені як клон. Це прекрасно працює, і клонований репозиторій може виконувати cvsexportкомісії так само, як описано вище. Однак є один застереження. Через те, як CVS здійснює повернення через різні ідентифікатори комісій (як описано вище), ви не хочете, щоб ваша клонована гілка відстежувала центральне сховище git. За замовчуванням так git cloneналаштовано ваш сховище, але це легко виправити:

% git clone [CENTRAL_REPO_HERE]
% cd [NEW_GIT_REPO_DIR_HERE]
% git config --unset branch.master.remote
% git config --unset branch.master.merge

Після видалення цих конфігурацій вам доведеться чітко сказати, з чого і з чого вийти, коли ви хочете зайняти нові коміти з центрального сховища:

% git pull origin master

В цілому, я вважаю, що цей робочий потік є досить керованим, і «наступна найкраща річ» при повністю міграції до git не є практичною.


3
Дякую. Це дуже допомогло мені, особливо порада щодо використання нешвидкого переходу вперед для об'єднання змін для CVS в один комітет.
skiphoppy

8
Для запису параметр -A, який ви пропонуєте використовувати для git-cvsimport, згадується на сторінці сторінки як "не рекомендується ... якщо ви збираєтесь знову експортувати зміни до CVS пізніше за допомогою git-cvsexportcommit (1)." У моєму випадку мені насправді подобається те, як виходять автори.
skiphoppy

2
Дякую за поради. Одним зручним, що я зробив, є додавання "cvs =! Git cvsimport -k -a" під [псевдонім] у мій .gitconfig. Це робить так, що "git cvs" буде DTRT (зверху дерева).
bstpierre

1
Якщо вам не вистачає git cvsimportспроби Debianapt-get install git-cvs
Tino

5
Mac OSX mavricks не вистачає відеореєстратора повністю, і здається, що git cvsimport залежить від резюме. Initialized empty Git repository in /Users/gus/projects/foo/foobar/.git/ Can't exec "cvsps": No such file or directory at /Applications/Xcode.app/Contents/Developer/usr/libexec/git-core/git-cvsimport line 777. Could not start cvsps: No such file or directory git cvsimport: fatal: cvsps reported errorТож, на жаль, це не обійде вас відсутністю CVS :(
Gus

22

Не слід сліпо довіряти cvsimport і перевіряти, чи імпортне дерево відповідає тому, що є у репортажі CVS. Я зробив це, поділившись новим проектом, використовуючи плагін CVS eclipse, і виявив, що були невідповідності.

Два коміти, які були виконані менше ніж за хвилину з тим самим повідомленням про фіксацію (з метою відновлення помилково видаленого файлу), були згруповані в одну велику комісію, в результаті чого файл з дерева відсутній ..

Мені вдалося вирішити цю проблему, змінивши параметр 'fuzz' менше ніж за хвилину.

приклад:

% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \
  -A /path/to/authors/file cvs_module_to_checkout -z 15

підсумок: перевірте дерево після імпорту


3

На додаток до відповіді Брайана Філліпса: є також git-cvsserver, який функціонує як сервер CVS, але насправді має доступ до сховища git ... але він має деякі обмеження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.