LINUX.ORG.RU

DCVS как часто вы делаете commit?


0

0
Есть ли рекомендации по частоте commit, а то постоянно ловлю себя на том что изменено очень много, и во время комита приходится сидеть и вспминать что же я поменял, и на сколько информативным должен быть лог? у меня git и спраштваю про распределенные системы
anonymous
Я как на SVN в своё время делал коммиты перед работой, так и на hg сейчас то же самое практикую.

Вот push/pull делаю реже. Периодически приходится конфликты расхлёбывать. Работаю с 4-6 мест с центральным репозиторием :)
KRoN73 ★★★★★
()
фича\багфикс -> коммит. главное, чтобы после каждого коммита приложение было рабочим. изредка правда забываю коммитить, когда увлекаюсь, и получается большой коммит с кучей изменений. сейчас стараюсь изменить это на создание ветки для группы связанных изменений с последующим мерджем.
volh ★★
()
прога запускается -> commit
большой кусок кода -> commit
багфикс -> commit

когда сам работаю -> коммит раз в 1-2 часа
на работе - некрофилия, как прихожу - cvs update, перед уходом - cvs commit


PS mercurial рулит!
generatorglukoff ★★
()
За коммиты больших диффов с кучей семантически независимых изменений
следует отрывать яйца.

Иногда зарабатываешься и замечаешь, что дифф разросся и его можно
было бы порезать перед коммитом. Удобная рабочая среда помогает в
этом. В Emacs можно просматривать дифф одного файла или всего проекта
и удобно кромсать сам _патчик_, поэтому лишние изменения можно
отрезать и переместить в отдельный патч, потом закоммитить оставшееся,
потом закоммитить то, что было лишним.

И ещё. Большинство DVCS (Меркуриал точно умеет, гит, наверное, тоже)
умеют гонять произвольные хуки перед коммитом, прописываешь туда
коммит только при успешном `make check` и всё, enjoy your TDD: пока
тесты не пройдёшь — не закомитишь.
Sphinx ★★☆☆
()
Силь распределённых систем контроля версий в том, что коммитить можно чаще без нареканий со стороны остальной команды. Всё равно потом мержить, но здесь хоть можно определить что и когда мержить, а не ругаться при каждом коммите с конфликтами, из-за того, что рабочий репозитарий один.
marsijanin ★★
()
Когда фикшу баги - бывает и раз в 2-5 минут (вплоть до того, что в одной ветке один коммит).

Когда фичи делаю - от 20 минут до часу.

Причем если изменений слшком много - использую stage hunk - чтобы коммитить файлы по кусочкам.

stpg ★
()

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

// wbr
klalafuda ★☆☆
()
Самая простая и хорошая рекомендация (проверенная практикой): нужно коммитить не огромными пачками изменения, а меленькими. Тогда намного проще ориентироваться вообще, и, соответственно, писать лог.
smh ★★★
()
Ответ на: комментарий от smh
+1

Если после изменений не сразу понятно, что же получается в diff, то надо разбивать и делать несколько коммитов. Ну и желательно, чтобы при коммите можно было все одной строкой описать.

kamre ★★★
()
Стараюсь делать почаще, один коммит на одно цельное изменение (будь то багфикс, новая фича или просто переформатирование кода), но постоянно срываюсь на большие коммиты :(

Пока не придумал, как себя перевоспитать...

WFrag ★★★★
()
Ответ на: комментарий от smh
> Самая простая и хорошая рекомендация (проверенная практикой): нужно коммитить не огромными пачками изменения, а меленькими. Тогда намного проще ориентироваться вообще, и, соответственно, писать лог.

отвлекаясь от конкретно DCVS - а мёржи бранчей? сделали бранч специально под какую-то новую фичу, мужики сидят, трудятся месяц и после мёржат его в хед. там в любом случае будет тааакой патч, что мама не горюй :)

я к тому, что конкретные количественные рекомендации в данном случае IMHO несколько надуманны, тк ситуации бывают разные, коллективы разные включая индивидуалов, да и сами по себе цели использования *VCS то-же могут быть разными. ну к примеру, есть проект, который пишется локально а вот собирается и тестируется удалённо. и VCS в данном случае - это может быть в первую очередь удобный инструмент для синхронизации дерева исходников, а логи все равно никто никогда реально читать не будет. всяко бывает.

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda
> я к тому, что конкретные количественные рекомендации в данном случае IMHO несколько надуманны, тк ситуации бывают разные, коллективы разные включая индивидуалов, да и сами по себе цели использования *VCS то-же могут быть разными.

Согласен. То была такая общая рекомендация. Конечно, все зависит от конкретной ситуации.

smh ★★★
()
Ответ на: комментарий от klalafuda
> отвлекаясь от конкретно DCVS - а мёржи бранчей?

А что с ними? Разве в нормальных VCS при этом не переносятся все патчи из одной ветки в другую (т.е. оригинальное деление на небольшие патчи сохраняется)? Или имеется в виду, что в таком случае специально все одним патчем переносят?

Насчет деления: я из DVCS работал с darcs - у него есть прикольное умение интерактивно выбирать те элементарные изменения в файлах, которые должны войти в патч. Очень помогает делать семантически атомарные патчи - не нужно постоянно себя контролировать и работать лишь над чем-то одним регулярно фиксируя изменения. Бывает, конечно, что два разных изменения оказываются в смежных строках и darcs не может понять, что они отдельные. Но это реже.

Как с этим в других DVCS?

anonymous
()
Ответ на: комментарий от anonymous
> Насчет деления: я из DVCS работал с darcs - у него есть прикольное умение интерактивно выбирать те элементарные изменения в файлах, которые должны войти в патч. Очень помогает делать семантически атомарные патчи - не нужно постоянно себя контролировать и работать лишь над чем-то одним регулярно фиксируя изменения. Бывает, конечно, что два разных изменения оказываются в смежных строках и darcs не может понять, что они отдельные. Но это реже.

> Как с этим в других DVCS?

с этим хорошо:

http://www.selenic.com/mercurial/wiki/index.cgi/RecordExtension

anonymous
()
Ответ на: комментарий от anonymous
или, если изменения не пересекаются в одних и тех же файлах, то можно коммиту указать файлы и каталоги, изменения в которых нужно зафиксировать.
anonymous
()
Ответ на: комментарий от klalafuda
Как показывает логика и практика (если разработчиков > 1), имеет смысл коммит делать тогда, когда решена определенная задача, будь то исправление ошибки в одной строчке или новая библиотека. Локально, пока изменения не готовы для переноса в публичную ветку, можно хоть как изгаляться - хоть через MQ, хоть через кучу мелких коммитов, которые затем объединить в один набор изменений (речь о mercurial). Через это имеем в публичных ветках логически чистую историю изменений. В чем сакральный смысл привязки изменений ко времени (коммиты каждые 2 часа, сутки и т.п)?
anonymous
()
> постоянно ловлю себя на том что изменено очень много, и во время комита приходится сидеть и вспминать что же я поменял, и на сколько информативным должен быть лог? у меня git

Решение этих проблем - Mercurial с MQ. Хотя в Git тоже может быть что-то такое.

Я лично с недоумением вспоминаю SVN, где этого не было. Как это так - сделать коммит правильным и красивым с первого раза? %)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous
> Как показывает логика и практика (если разработчиков > 1), имеет смысл коммит делать тогда, когда решена определенная задача, будь то исправление ошибки в одной строчке или новая библиотека.

ну это конечно желательно. на самом деле, это и для 1го человека то-же верно. разве что VCS используется как rsync в сугубо автоматическом режиме.

> В чем сакральный смысл привязки изменений ко времени (коммиты каждые 2 часа, сутки и т.п)?

нету в этом никакого сокрального смысла :) ну разве что нет доверия своему рабочему месту и комит делается в первую очередь в целях бэкапа. но в бездумном режиме это все-таки зло и откатываться потом может быть оччень непросто.

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от tailgunner
> Я лично с недоумением вспоминаю SVN, где этого не было. Как это так - сделать коммит правильным и красивым с первого раза? %)

ммм... по всей видимости, предложение "десять раз подумай и лишь потом закомить. чуть-чуть." не подходит? :)

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda
>> Я лично с недоумением вспоминаю SVN, где этого не было. Как это так - сделать коммит правильным и красивым с первого раза? %)

> ммм... по всей видимости, предложение "десять раз подумай и лишь потом закомить. чуть-чуть." не подходит? :)

Нет.

А как насчет выражения о вкусе устриц? ;)

tailgunner ★★★★★
()
Ответ на: комментарий от klalafuda
> > Я лично с недоумением вспоминаю SVN, где этого не было. Как это так - сделать коммит правильным и красивым с первого раза? %)

> ммм... по всей видимости, предложение "десять раз подумай и лишь потом закомить. чуть-чуть." не подходит? :)

забыл подписаться:

// Ваш К. О.

А если серьезно, то ведь бывает, что логически целостное изменение занимает по времени не одну неделю и хорошо бы иметь инструмент для "отслеживания версий одного изменения" :) меркуриал (как наверное и некоторые другие) этот инструмент дает, а пользоваться им или - нет, тут уж каждый выбирает сам.

anonymous
()
Ответ на: комментарий от anonymous
>А если серьезно, то ведь бывает, что логически целостное изменение занимает по времени не одну неделю и хорошо бы иметь инструмент для "отслеживания версий одного изменения" :) меркуриал (как наверное и некоторые другие) этот инструмент дает, а пользоваться им или - нет, тут уж каждый выбирает сам.

вы имеете ввиду разработка в отдельной ветке, с последующим мержем. или разбиение одного большого комита на несколько патчей?

anonymous
()
Ответ на: комментарий от anonymous
помоему сейчас логично всплывет вопрос о выборе системы контроля версий:) какие есть преимущества у разных систем?
anonymous
()
Ответ на: комментарий от anonymous
> А если серьезно, то ведь бывает, что логически целостное изменение занимает по времени не одну неделю и хорошо бы иметь инструмент для "отслеживания версий одного изменения" :)

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

> меркуриал (как наверное и некоторые другие) этот инструмент дает, а пользоваться им или - нет, тут уж каждый выбирает сам.

ну с точки зрения cvs/svn на этот случай есть бранчи. завёл бранч в нём и играйся сколько хочешь. как закончили - смержили его в хед. пользоваться этой фичей или нет - это уже кому как нравится.

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от anonymous
> вы имеете ввиду разработка в отдельной ветке, с последующим мержем. или разбиение одного большого комита на несколько патчей?

Имею в виду, что локально неплохо иметь инструмент для отслеживания изменений по работе над какой-то задачей, которая в публичной ветке по частям появляться не должна, а только целиком, когда будет решена. Чтобы не засорять общую историю изменений ненужными локальными изысканиями. В меркуриале для этого можно использовать:

1) MQ - очередь патчей, которые накладываются на основной код. Когда задача решена, патчи объединяются в один набор изменений, который коммитится в основной код.

2) Коммитить промежуточные изменения тоже в основной код, а затем объединить их все в один набор изменений.

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

anonymous
()
Ответ на: комментарий от anonymous
> 1) MQ - очередь патчей, которые накладываются на основной код. Когда задача решена, патчи объединяются в один набор изменений, который коммитится в основной код.

ммм... а разве "бранч" в понятии CVS/SVN - это не то же самое, что вы описали :-? или MQ имеет какие-то дополнительные фичи?

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda
> разве "бранч" в понятии CVS/SVN - это не то же самое, что вы описали :-?

Нет. Жалкое подобие :)

> или MQ имеет какие-то дополнительные фичи?

Да. Любой патч можно редактировать (ага, в SVN такое можно, при большом желании).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner
> Да. Любой патч можно редактировать (ага, в SVN такое можно, при большом желании).

простите конечно за чайниковский вопрос, но зачем может понадобиться *редактировать* патчи :-?

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda
> зачем может понадобиться *редактировать* патчи :-?

Ну типа разработка - итеративный процесс, не?

А вообще попробуй сам. Mercurial по первости в использовании не сложнее SVN, имеет инстрменты импорта SVN-репозиториев. Или можно сделать репозиторий из рабочей копии.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner
Ну, когда идеология работы над крупными изменениями такова, что в процессе работы ведется одна история изменений, а при вливании в основную ветку это делается одним патчем (а локальная история херится), то SVN как раз подходит - там все так и работает с ветками и их слиянием.

Но, по-моему, очень часто хочется вливать одну ветку в другую сохраняя исходное деление на патчи. А делать историю патчей красивой - тут и помогают всякие фишки типа редактирования патчей и проч.

anonymous
()
Ответ на: комментарий от tailgunner
> Ну типа разработка - итеративный процесс, не?

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

> А вообще попробуй сам. Mercurial по первости в использовании не сложнее SVN, имеет инстрменты импорта SVN-репозиториев. Или можно сделать репозиторий из рабочей копии.

да мне пока что и CVSа хватает, куда уж мне до меркуриала :)

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от anonymous
> очень часто хочется вливать одну ветку в другую сохраняя исходное деление на патчи. А делать историю патчей красивой - тут и помогают всякие фишки типа редактирования патчей и проч.

Об этом и речь. Вливание одним большим патчем - это полный ахтунг, потом бисекцию хрен сделаешь, даже просто разобраться трудно. А так - история хоть и поддельная, но зато чистая :)

tailgunner ★★★★★
()
Ответ на: комментарий от klalafuda
> что-то придумал, написал локально, закомитил в бранч, тестеры подхватили

Личный бранч и персональные тестеры? :) Ты по результатам тестирования делаешь новые changeset'ы, а мог бы править существующие - история чище и для бисекции удобнее.

> да мне пока что и CVSа хватает

ыыыы, ужоснахтунг O_o Я так и не смог себя заставить пользоваться CVS - он мешал больше, чем помогал.

> куда уж мне до меркуриала :)

Дело твое.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner
> Личный бранч и персональные тестеры? :)

ну что значит - личные? конечно не личный. общественные. есть development team, есть - QA. это разные человеки и задачи/инструментарий/etc у них тоже разные. если стоит у QA в планах тестирование такого то бранча - нет проблем, берут его и тестируют а найденные баги репортят в багзилу. что собственно удивительного в такой организации труда :-? это впрочем не означает, что девелоперы не тестируют свой код - конечно тестируют. но полноценные комплексные тесты системы - дело достаточно сложно и муторное -> есть отдельный тим.

> Ты по результатам тестирования делаешь новые changeset'ы, а мог бы править существующие - история чище и для бисекции удобнее.

ну это уже на самом деле IMHO мелочи. опять же, править живой код и вносить соотв. изменения в VCS чисто технологически наверное удобнее, чем поднимать патчи, искать в них что и как, править etc.

ps: а что такое "бисекция"? попытки протрассировать это слово по аналогиям завели в такие далёкие от vcs дебри...

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от tailgunner
Вот никогда не понимал этой любви к переписыванию истории. Ещё и rebase придумали, еретики. По-моему, всё это происходит из подсознательной боязни сделать ошибку и нетерпимости к чужим ошибкам. Многие люди как усвоили от своих родителей и школьных учителей привычку чужие ошибки высмеивать, так и живут, других гнобят, сами боятся. А что такого, ну ошибся, следующим коммитом поправил. А чтоб ничего не ломалось, надо не палочную дисциплину наводить, а тесты человеческие писать. А история ошибок сама по себе ценна, помогает лучше понять ход мыслей разработчика, и даже если от каких-то идей в процессе разработки пришлось отказаться, в логах они всё равно останутся для истории, ничто не потеряно. А так человек месяц корпит-корпит, а в итоге получаются 5 тощеньких патчей, это почти такая же потеря информации, как и при случайных коммитах раз в неделю, лол.
ero-sennin ★★
()
Ответ на: комментарий от klalafuda
> что такое "бисекция"?

Метод механического поиска изменения, внесшего ошибку - по сути, двоичный поиск на графе ревизий. Автоматизирован в приличных DVCS, но полагается на то, что все вершины графа являются вполне работоспособными.

http://www.selenic.com/mercurial/wiki/index.cgi/BisectExtension

tailgunner ★★★★★
()
Ответ на: комментарий от klalafuda
> а что такое "бисекция"?

Думаю, tailgunner имеет в виду поиск проблемных патчей путем деления истории пополам. Я бы сказал шире - перенос истории изменений при слиянии веток упрощает задачи анализа изменений через некоторый период времени.

Если в отдельной ветке делалась какая-то небольшая, семантически атомарная фишка, тогда, возможно, имеет смысл в чистую, сборочную ветку переносить соответствующие изменения одним патчем (чтобы потом удобно было Changelog автоматически генерировать).

Но так бывает редко. Это еще, конечно, вопрос интерпретации понятия "атомарная". Для кого-то новая кнопочка - отдельная фишка, а для кого-то таковой является целая подсистема.

В общем, по-моему, хорошо, когда VCS позволяет с легкостью придерживаться разных подходов - и вливать много патчей как один, и вливать много патчей как множество.

Кстати, неужели удобно пользоваться CVS, который с отдельными файлами работает? Лично для меня переход CVS -> SVN был гораздо более эйфоричным, нежели переход SVN -> darcs, именно по причине атомарных изменений на уровне нескольких файлов в SVN.

С CVS-ом приходилось всякие перловки писать для банального анализа истории.

anonymous
()
Ответ на: комментарий от ero-sennin
> никогда не понимал этой любви к переписыванию истории. Ещё и rebase придумали, еретики.

На костер отступников! :)

> По-моему, всё это происходит из подсознательной боязни сделать ошибку и нетерпимости к чужим ошибкам.

Это происходит из нескольких простых наблюдений: рулят относительно небольшие изменения в транзакционном стиле; ошибки неизбежны; многие ошибки вылезают довольно быстро после коммита.

> ну ошибся, следующим коммитом поправил.

Ну два коммита вместо одного, граф ревизий в два раза раздулся - какая фигня :)

> история ошибок сама по себе ценна, помогает лучше понять ход мыслей разработчика, и даже если от каких-то идей в процессе разработки пришлось отказаться, в логах они всё равно останутся для истории,

В общем-то да, но 1) ты же сам выбираешь, что убрать, а что оставить 2) кроме логов VCS есть еще (теоретически, по крайней мере) Вики и багтрекер.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner
> http://www.selenic.com/mercurial/wiki/index.cgi/BisectExtension

фича конечно интересная, но, боюсь, далеко не всегда применимая на практике. проблема в том, что далеко не так просто идентифицировать версию, в которой точно нет такого-то бага. особенно если это скрытый рейс, который проявляется при весьма специфическом стечении обстоятельств и с бОльшей вероятностью прошёл штатные тесты системы [запросто. они то-же не идеальны.]. по крайней мере по своей практике могу лишь сказать, что проблемы, которые действительно можно было назвать гордым словом Баг [а не банальный хорошо трассируемый SIGSEGV] и на который даже на просто точную идентификацию и повторяемость могли уходить недели, обычно всплывал неожиданно, рождался когда-то давным-давно не совсем непонятно кем и мог жить долго-долго. просто сегодня вот так сошлись звёзды, что всё упало. наконец то.

впрочем, не спорю с тем, что где-то бисекция может быть полезной.

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от ero-sennin
Такую историю тяжело анализировать спустя время. Но на самом деле, лучшее решение - это не переписывание истории для "чистой" ветки, а формирование имен патчей со специальными пометками, которые будут потом позволять делать выборки нужных патчей. Чтобы можно было видеть историю на разных уровнях. Захотел - взглянул в целом, на уровне прошедших в выпуск элементов функциональности. Захотел - взглянул на уровне изменений в рамках работы над одним таким элементом. Захотел - увидел всю историю как есть.

Но это надо не просто отметки и поиск по ним (как в darcs, скажем), но еще и автоматическую группировку пометок, чтобы было удобно на любом уровне такой многоуровневой истории работать с патчами.

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

anonymous
()
Ответ на: комментарий от klalafuda
>> http://www.selenic.com/mercurial/wiki/index.cgi/BisectExtension

> фича конечно интересная, но, боюсь, далеко не всегда применимая на практике. проблема в том

Блин, да понятно это всё. Но никто не обещал серебряной пули.

> скрытый рейс, который проявляется при весьма специфическом стечении обстоятельств

Практически всегда перед тем, как исправить ошибку, ее приходится воспроизвести.

> где-то бисекция может быть полезной.

Ога, даже беглое чтение lkml это доказывает :D

tailgunner ★★★★★
()
Ответ на: комментарий от ero-sennin
> Вот никогда не понимал этой любви к переписыванию истории. Ещё и rebase придумали, еретики.

Это не для переписывания истории, а для избавления от излишнего ветвления. Mercurial (как и другие DVCS, наверное) обладает свойством таким - ветвление на каждом шагу. Pull изменений, работа недельку, коммит и вот уже имеем ветку которую надо мержить, а во многих случаях оно по сути и не ветка вовсе, так как мои изменения не пересекаются с теми что были между двумя этими pull'ами. И rebase как раз помогает сделать это не веткой а просто очередным коммитом.

И усилий никаких не требует:

hg pull; hack ...;hg ci;hg pull;hg rebase

вуаля

anonymous
()
Ответ на: комментарий от klalafuda
Тем не менее, большая часть ошибок - банальны и отыскиваются по истории изменений. И очень удобно, если такие неинтересные ошибки можно локализовывать автоматически.
anonymous
()
Ответ на: комментарий от anonymous
Ничего плохого в ветвлении я не вижу. Мёржей боятся те, кто слишком долго сидел на CVS/SVN. Конкретно к rebase претензии такие: в отличие от merge, он изменяет старые ревизии, хотя вся удалённая работа основана на их иммутабельности. Поэтому делать его можно только в локальной ветке, которую ты никогда никому не показывал.

А история мёржей, что мне нравится, показывает, как оно было на самом деле, безо всякой показухи. Смотришь на граф ревизий, и все проблемы координации разработки сразу как на ладони.

ero-sennin ★★
()
Ответ на: комментарий от klalafuda
> да мне пока что и CVSа хватает, куда уж мне до меркуриала :)

с содроганием вспоминаю времена, когда работали под CVS. Отсутствие атомарных коммитов - вообще жопа. Как-то так хватило нам смелости сделать кардинальный шаг - перелезли с цвса сразу на Mercurial. Самая главная сложность была - не освоение mercurial, нет. А разработка четкой, по возможности простой методики работы, которой бы все следовали. В CVS с этим проще - hg co, hg ci, все по сути. Рассматривали как вариант SVN, но Mercurial лучше подошел в силу нескольких важных причин.

"Попробуй - полюбишь" :) Он прост, проще некуда. Впрочем, если все устраивает в CVS'е, то зачем я все это говорю :)

anonymous
()
Ответ на: комментарий от ero-sennin
собсно, речь и была про локальную ветку
anonymous
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.