Как лучше разветвляться в Clearcase?
Ранее я задокументировал свое мнение о Clearcase как о системе контроля версий, но, к сожалению, я все еще использую ее. Поэтому я обращаюсь к вам, ребята, чтобы помочь мне облегчить одно из моих разочарований.
Мы только что перешли от системы с одной веткой на разработчика к одной ветке на задачу, чтобы попытаться решить некоторые проблемы, которые у нас возникали при определении того, почему определенные файлы были изменены. Обычно я доволен решением, но есть одна серьезная проблема. Мы используем простые сценарии для запуска и завершения задач, которые создают новую ветку с именем пользователя и номером задачи, а затем обновляют представление локального снимка, чтобы иметь спецификацию конфигурации, подобную следующей:
элемент * CHECKEDOUT элемент * .../martin_2322/ ПОСЛЕДНИЕ элемент * /main/LATEST -mkbranch martin_2322 загрузить / Проект / Приложение
Допустим, у моего проекта есть два связанных файла A.cs и B.cs. Для моей первой задачи я делаю изменения в A на ветке. Затем мне нужно по какой-то причине прекратить работу над задачей 2322 и начать работу над задачей 2345 (задача 2322 не завершена, поэтому я не объединяю ее с основной). Я создаю новую ветвь задачи 2345, редактирую A.cs и B.cs и объединяю результаты обратно в основную. Теперь я возвращаюсь к работе на 2322, поэтому я изменяю свою конфигурационную спецификацию обратно на ту, которая была определена выше. На этом этапе я вижу файл A.cs из ветви задач (как я редактировал его ранее, поэтому я получаю версию, локальную для этой ветви) и последнюю версию B.cs из main. Поскольку у меня нет изменений, внесенных в A.cs на ветке 2345, сборка обрывается. Вместо этого мне нужно иметь возможность выбрать задачу 2322 с того места, где я остановился, и увидеть ее со старой версией A.cs - той, которая была последней в main при создании ветки.
На мой взгляд, у меня есть несколько вариантов, чтобы это исправить:
Измените спецификацию конфигурации, чтобы она получала файлы от main в нужное время. Это достаточно легко сделать, если я знаю дату и не возражаю установить ее вручную, но я не могу понять, как автоматизировать это в наших сценариях переключения задач. Есть ли способ получить дату создания филиала?
Создайте ярлык для каждой ветви на главной. Теоретически это просто сделать, но система маркировки в нашей установке CC уже рушится под весом нескольких сотен ярлыков, поэтому я не знаю, справится ли она с одной на разработчика на ветку (обратите внимание, что задача в моем примере 2322, и мы проходим только четверть проекта)
Слейтесь из основного в ветку задач. Еще раз должно работать, но тогда долго работающие ветви будут не только содержать файлы, измененные для этой задачи, но и все файлы, которые должны были быть объединены для работы несвязанных вещей. Это делает их такими же сложными, как и подход "ветка на разработчика". Я хочу посмотреть, какие файлы были изменены для выполнения конкретной задачи.
Я надеюсь, что я что-то здесь упустил, и есть способ настроить мою конфигурационную спецификацию так, чтобы она извлекала ожидаемые файлы из main без неуклюжих обходных путей. Итак, как вы, ребята, разветвляетесь в Clearcase?
3 ответа
Вы можете получить дату создания ветки, используя команду description в cleartool.
cleartool describe -fmt "%d" -type martin_2322
Это распечатает дату и время, когда была создана ветвь. Вы можете использовать это для реализации вашего первого варианта. Для получения дополнительной информации вы можете прочитать следующие справочные страницы по cleartool, но, надеюсь, приведенная выше команда - все, что вам нужно.
cleartool man describe
cleartool man fmt_ccase
Несколько комментариев:
ветвь на задачу - это правильная гранулярность для изменения набора файлов в "единице работы". При условии, что "задача" не слишком узка, в противном случае вы получите gazillon ветвей (и их слияния)
когда вы создаете спецификацию конфигурации для ветки, вы, очевидно, забываете строку для новых элементов (ту, которую вы "добавляете в систему управления версиями")
Кроме того, вы можете рассмотреть возможность ветвления для фиксированной начальной точки, которая решит бит "старая версия A.cs - та, которая была последней в main при создании ветки".
Я знаю, что у вас уже слишком много ярлыков, но у вас может быть скрипт для "закрытия" задачи, который (среди прочего) удалит этот начальный ярлык, избегая загромождения меток.
Вот спецификация конфигурации, которую я бы использовал:
element * CHECKEDOUT
element * .../martin_2322/LATEST
element * STARTING_LABEL_2322 -mkbranch martin_2322
# selection rule for new "added to source control" file
element * /main/0 -mkbranch martin_2322
load /Project/Application
Я бы нашел это намного проще, чем вычисление даты ветки.
- не забывайте, что вы можете объединить свою задачу с основной и объединить некоторые свои файлы из ветки готовой задачи в новую ветвь текущей задачи, если вам нужно также перенести некоторые исправления обратно в текущую задачу.
Мы используем Clearcase и обнаруживаем, что создать ветку для выпуска часто гораздо проще, чем делать это по заданию. Если вы создадите его по заданию, то у меня будет "основная ветвь" для этого выпуска, и ветвления задач из этой ветки, а затем объедините их обратно, когда закончите, чтобы объединить их обратно в ствол.