LINUX.ORG.RU

Как Ъ откатить часть толстого проекта?

 ,


0

1

Сабж. Проект мигрировал с CVS под git, есть единственная ветка. По нашим меркам проект толстый (100к строк).

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

Коммит на котором все работало бол-мен известен.

По идее изменения которые нужно откатывать затрагивают относительно небольшое число файлов. Беда в том, что часть из этих файлом менялись в каждом втором коммите, например CMakeLists.txt. Кроме того за это время система сборки была здорово переписана, появилась какая то куча смаке модулей и пр. Автор всего этого недоступен на неопределенный срок, я в cmake разбираюсь крайне плохо.

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

★★★★

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

yetanother ★★
()

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

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol

Разбросано конечно. Но некоторые файлы придется откатывать частями.

на самом деле все еще хуже - речь идет о двух взаимодействующих проектах;-) Ну видимо их придется как то параллельно причесывать…

AntonI ★★★★
() автор топика
Ответ на: комментарий от ya-betmen

Коммит на котором все условно работало отстает на два десятка коммитов от текущего состояния. Меня бы наверное устроило слияние того коммита с текущим состоянием, но это неточно.

Непонятно че вообще делать с системой сборки. Видимо только методом тыка…

AntonI ★★★★
() автор топика
Ответ на: комментарий от AntonI

то, что «часть файла» - импоссибле, только руками.

если список файлов имеется, скорми его по очереди команде git checkout <goodCommit> -- ${pathToFile} например, сложив нужные пути в файл и потом cat requiredPaths.txt | xargs -n1 -I{} git checkout <goodCommit> -- {}

aol ★★★★★
()
Ответ на: комментарий от aol

Пока что я пытаюсь понять как получить общий список файлов измененных с конкретного коммита;-)

AntonI ★★★★
() автор топика
Ответ на: комментарий от ya-betmen

Во, спасибо большое! Я че то в git log это пытался найти… ;-(

AntonI ★★★★
() автор топика

Я бы наверное сделал git reset --hard <good-commit> && git reset <latest-commit> (откат рабочего каталога на старое состояние), а потом с помощью tig и редактора возвращал новые изменения, проверяя работоспособность сборки и наличие бага. Но здесь пригодится некоторый навык и умение пользоваться tig, лучше тренироваться на копии репозитория.

Коммит на котором все работало бол-мен известен.

Может git blame покажет, какой коммит всё сломал, тогда его можно откатить либо же исправить.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Для меня это уже высший пилотаж;-(

В итоге я достал из рабочего коммита CMakeLists.txt и ключевой .i файл для swig-а а потом запустил cmake/make и начал тупо чинить руками то что отвалилось. Оказалось на удивление просто, после некоторых танцов с бубном оно собралось и даже какие то тесты работают.

@ya-betmen, @aol - спасибо за помощь!

Конечно там какие то хвосты остались висеть, но это уже надеюсь другие люди решать будут;-)

Надо бы конечно с гитом разобраться получше…

AntonI ★★★★
() автор топика

Сделай бэкап да поэкспериментируй :) Пока жива хотя б одна копия гитовой репы в оригинальном состоянии — все относительно безопасно и восстановимо :)

slackwarrior ★★★★★
()

Вот поэтому надо мигрировать с git на darcs, ну или pijul

(Это не поможет разобраться с уже существующей проблемой)

Crocodoom ★★★★★
()
Последнее исправление: Crocodoom (всего исправлений: 2)
Ответ на: комментарий от AntonI

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

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

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

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

AntonI ★★★★
() автор топика
Ответ на: комментарий от Crocodoom

Я хочу верить что git это последняя система контроля версий с которой мне придется в жизни разбираться. Жизнь на самом деле короткая, и в ней есть куча куда более интересных вещей чем осванивание новых инструментов.

AntonI ★★★★
() автор топика
Ответ на: комментарий от LamerOk

Это все очень субъективно. Скажем физика мне нравится больше чем изучение пятой по счету системы контроля версий.

AntonI ★★★★
() автор топика
Ответ на: комментарий от AntonI

Но, как мне кажется, у тебя нет выбора между физикой и пятой по счёту (из трех реально существующих, из которых две уже в формалине) системы контроля версий.

У тебя выбор между изучением системы контроля версий и

я достал из рабочего коммита CMakeLists.txt и ключевой .i файл для swig-а
потом запустил cmake/make
начал тупо чинить руками то что отвалилось.
после некоторых танцов с бубном оно собралось
какие то тесты работают.
Конечно там какие то хвосты остались висеть
это уже надеюсь другие люди решать будут;-)

Не то, чтобы я осуждал. В конце концов, это все очень субъективно.

LamerOk ★★★★★
()
Ответ на: комментарий от ya-betmen

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

Но вес равно в итоге упрется в систему тестов. В одном из проектов у нас молодежь прикрутила гугл-тесты - мне скорее не понравилось. Много букв, и концепция «все есть тест» (где много букв) мешает жить. Кабы то же самое, но полаконичней…

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

AntonI ★★★★
() автор топика
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от LamerOk

У тебя выбор между изучением системы контроля версий и …

Задачи типа этой я решаю раз в три года, как правило этим занимаются другие люди. Я в итоге больше времени потратил на написание комментов в этом треде чем на ее решение. Ради одного часа в три года учить новую систему контроля версий…

Но, как мне кажется, у тебя нет выбора между физикой и пятой по счёту (из трех реально существующих, из которых две уже в формалине) системы контроля версий.

Вам кажется.

AntonI ★★★★
() автор топика
Ответ на: комментарий от AntonI

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

Тут к сожалению не помогу. Я как-то уже примерно знаю что мне нужно и в случае необходимости просто догугливаю забытые места.

С другойстороны если вас там немного то вы можете просто устно договориться не ломать мастер. И бить того кто договоренность нарушает.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Дык он же не со зла… Он и не знал что сломал что то. Разные версии всяких утилит + разные ОС + куча функционала + цейтнот. Я не удивлюсь если у него вообще все работало.

Что бы такого не было нужны не просто тесты - эти тесты нужно гонять на разных платформах потому что проект кроссплатформенный. Ну и делает это все полтора инвалида - на выходе что есть то есть;-(

AntonI ★★★★
() автор топика
Ответ на: комментарий от AntonI

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

Нет такого. Если кратко, для CI твой выбор заключается в том, продаться гитхабу или продаться гитлабу.

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

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

Если не приперло - ну и не парься.

Vit ★★★★★
()
Ответ на: комментарий от Vit

продаться гитхабу или продаться гитлабу.

В таких проектах репа обычно на своем сервере за семью печатями.

Если не приперло - ну и не парься.

Это философия мне нравится, но хотелось бы таки эту границу «когда припрет» чуть отодвинуть от себя. Эпизодически возникают идиотские ошибки когда одно починил а другое поломал и потом начинаешь вытаращив глаза искать поломанное.

AntonI ★★★★
() автор топика
Ответ на: комментарий от AntonI

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

Значит гитлабу, его вроде можно отдельно поднять на халяву. Есть еще github enterprize.

Вообще CI много, но я упомянул те, которые могут еще где-нибудь пригодиться.

Это философия мне нравится, но хотелось бы таки эту границу «когда припрет» чуть отодвинуть от себя. Эпизодически возникают идиотские ошибки когда одно починил а другое поломал и потом начинаешь вытаращив глаза искать поломанное.

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

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

Vit ★★★★★
()

Из раздела lmgtfy, но выглядит работоспособно:

Для одного файла и одного коммита:

git show <sha1> -- <filename> | git apply -R

Дальше - нужно скриптянский писать. Возможно, в каком-то из гуёв есть шоткат на это действие, но я ими не пользуюсь.

Важно понимать чем это решение отличается от git checkout <sha1> - тут ты именно отменяешь изменения только из этого коммита только для этого файла, а не откатываешь файл на версию .

pon4ik ★★★★★
()

Коммит на котором все работало бол-мен известен.

Ну я начинаю с того, что проверяю этот коммит, потом половинным делением иду с того коммита на более свежий, проверяю его и далее делю ещё раз пополам.

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

Хочется пока что тупо откатить эту часть, но не потерять кучу правок сделанных в других частях.

Ну значит, надо сначала точно установить виноватый коммит и проанализировать, ЧТО ИМЕННО в нём менялось, и что из этого ответственно за багу. Вычленить криминальное место и попробовать как-то откатить только его в последней ревизии.

P.S. Упс, опоздал.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

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

Зато в гите этот метод прямо вшили в бисект, насколько я понял. Правда я не пользовался.

P.S. Упс, опоздал.

Все равно спасибо;-)

AntonI ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.