Как организовать синхронизацию локальной копии кода между разными машинами (между коммитами)?
Имеем:
- разработческий и продакшен-версии проекта (сайта), LNAMP;
- один разработчик, разработческий комп, NetBeans 8, синхронизируемый проект (локальная копия, синхронизация при сохранении);
- гит-репозиторий, под гитом - только удаленные копии (дев и продакшен), но не локальная копия (по большому счету, используется лишь для деплоя изменений и контроля боевой среды на предмет внедрения вредоноса);
до этого момента все было хорошо и удобно, НО!
- возник второй комп (теперь в офисе), с которого иногда тоже хочется покодить;
Задача:
- организовать синхронизацию кода между этими разработческими компами (причем, синхронизацию МЕЖДУ коммитами... поделал дома, поделал на работе, вернулся домой, доделал, закоммитил, начал новый таск, уснул, на работе продолжил... и желательно с минимальным оверхедом на переключение между "дома" и "на работе");
Какие варианты НЕ подошли:
- полный даунлоад проекта перед тем, как начинать работать; самый феншуйный, но самый долгий вариант (ради получаса работы ждать час, пока он все скачает, а потом еще полчаса, пока взбесившийся SASS все перекомпилирует - занятие бестолковое);
- штатный синхронизатор НетБинса; во-первых, тоже медленный, т.к. один хрен чуть ли не весь код сначала выкачивает для сверки, а во-вторых - частенько ошибается в направлении синхронизации, и доверять ему слепо - нельзя, надо еще выверять глазами... в итоге, в пол-часа можно уложиться, но всеравно ради получаса работы - такое себе;
- первый или второй варианты с ручным ограничением папок... помогает, но очень частично (ну вот не всегда я помню, что я менял с момента, когда последний раз за этой машиной сидел... часто самый надежный вариант - заливать всё, т.к. ошибиться и затереть потом удаленный файл старой локальной копией - ну его, хрен потом найдешь, в чем проблема).
- гит, встроенный в нетбинс; потому что моя задача - синхронизация именно МЕЖДУ коммитами...
- оставить проект удаленно, без локальной копии; сразу все становится грустно и медленно, особенно, когда работаешь вне дома по мобильному инету... аплоад-он-сейв - и та порой подбешивает, но это периодически и терпимо, а если все там держать - то бекграунд-скан, поиски, саджесты и т.п. - вообще повергают в уныние; уж не говоря о счете за мобильный интернет )
Какие варианты пока только в голове:
- оставить проект синхронизируемым (он сейв). но держать локальную копию на гуглдрайве/ядиске/дропбоксе... плюсы: по ощущениям, в синхронизацию они умеют сильно лучше, чем нетбинс, к тому же - сделают это в фоне, и к моменту когда я созрел поработать - локальная копия будет уже свежей... минусы: от SASS-рекомпайла не спасет; безопасность - ибо все конфиги, пароли и явки окажутся в облаке, а там и до выдачи Яндекса недалеко)))
Вопрос:
- собственно, есть ли у кого-то опыт решения подобной задачи? Может я какого-то очевидного варианта не вижу?
Чем не вариант таки коммитить как есть перед уходом – пусть это WIP (Work in progress) коммит с кучей недоделок. Заодно коммент напишете, на какой мысли остановились. Может, в отдельной ветке, третьей, не dev и не master.
Сергей Соколов, в теории - да, но во-первых, это лишняя возможность забыть закоммитить wip, особенно в режиме (оймля порабежать), а во вторых, теряются привычные возможности стэшиться для "чуток подправить" и прочих манипуляций с unstaged изменениями..
может, оно того и стоит, но для начала - поискал бы варианты без ломки привычек )
Суть совета - комитить и пушить работу в отдельную ветку на одном компьютере, и пулить ее на другом, и продолжать работать. По окончанию работы - мержить эту ветку в основную, с которой работает ваш сайт
Dmitry MiksIr, а, ну этот-то вариант - понятен... хотя да, в посте я его изначально отметал... потому что знаю, что вечно буду забывать запушить недоделанное ))
с другой стороны... раз уж большинство к нему склоняются - видимо, есть смысл задуматься и поменять привычки...
Dmitry MiksIr, один из них - ноут... крышку захлопнул - и алес...
а вот вопрос - Нетбинс себя нормально ведет, если одновременно и "sync on save" и локальная копия под гитом? вечных циклов синхронизации не возникает? (не пробовал пока, завтра до машины доберусь - сам проверю, но вдруг ответ известен)
нормально, откуда там вечные циклы.
единственное, пул на рабочую копию с локальными изменениями может потребовать дополнительных телодвижений (stash изменений, конфликты)... решаемо, но будет злить ;) это я про случай, если вы изменения запушили и при этом ещё их синкнули с другой рабочей копией (там они как незакомиченные изменения)
циклы - пока не думал подробно, на уровне подозрений... вроде нет, но два механизма синхронизации на одном и том же объекте синхронизации - звучит подозрительно -))
про конфликты - не совсем понял... можно же ресет-хардом грохнуть перед пуллом... или я ситуацию не так понял?
ну вы можете и это забыть, начать дальше кодить, а потом запушить... в принципе максимум конфликт руками решать придется, но все же... проще приучить себя пушить ;)
я - могу, это факт -)))
ну, мне кажется, на крайняк можно руководствоваться принципом "удаленная копия - она самая актуальная" (что логично, вобщем-то, т.к. вся отладка и тесты - на ней прогоняются), и любые конфликты решать с плеча отказом от локальных изменений неизвестного происхождения -)
Dmitry MiksIr, посмотрел, как это работает на практике, и смутило, что я вынужден плодить WIP-коммиты каждый раз при смене машины... аменд - не спасает (т.к. предыдущий коммит уже на ремоуте, и аменд приводит к вынужденному слиянию и ребейсу, что еще веселее).
как бы вы предложили с этим быть?
- оставить 100500 wip-коммитов и тащить их все в мастер? - не нравится (т.к. потом гит-логом пользоваться невозможно, т.к. коммиты перестают быть логичными);
- сквошить випы каждый раз при вливании в мастер? - ну, проще, но всеравно лишний гемор, особенно при быстрой выкатке микро-изменений...
- третий вариант? -)
Сергей Соколов и Saboteur - вас тоже прошу совета, т.к. вы тоже за этот подход агитируете, значит, наверняка, в теме -))
Saboteur, исходные условия задачи как раз не дают реализовать предложенный подход одновременно с корректным разбиением на коммиты.
повторюсь: я ищу способ синхронизироваться между машинами в произвольный момент времени, независимо от того, в каком состоянии таск.. хоть на полуслове...
вы предлагаете коммитить и пушить при каждой пересадке (п.1 вашего комментария)...
но при этом, настаиваете на атомарности и завершенности изменений внутри коммита...
пока звучит как "не надо тебе пересаживаться за другую машину, пока таск не доделал" )))
Dmitry MiksIr, про разбитие - ответил выше (изначально я ищу способ синхронизироваться без привязки к завершенности задачи, какой бы мелкой она ни была... я не фуллтайм кодер, меня обстоятельста постоянно на полуслове сдергивают с места, а делать работу надо, хоть по строчке в день, причем на полустрочке меняя рабочую машину ))...
гора вип-коммитов... сильно мутит от мысли, особенно учитывая количество пересадок внутри таска... со сквошем (ребейсом) потренировался сегодня.... да, несложно, но много бардака получается, который теперь надо постоянно разгребать...
вобщем, охладел к подходу... либо я как-то неверно понимаю идею, либо открыт для новых идей...
UPD Хотя, иметь гит в локальной копии (а не только в удаленной) оказалось довольно приятно, в плане навигации по истории, в чатности - блейма... приятно, но пока гемора больше, чем пользы :(
такс, поигрался с ребейсом и сквошем... все круто, НО! опять же не решает вопроса синхронизации на разных машинах...
если я схлопнул свои 100500 коммитов на ноуте (rebase -i, squash) - то при пересадке на рабочую машину ПУЛЛ начинает мержить "схлопнутый" ориджин с "несхлопнутой" локальной версией, в итоге - имеем 100501 коммит (то, что было, плюс один - на слияние)... ну потом еще 100502й появится, когда я снова домой приду...
merge --squash - вроде позволяет оставить мастер чистым, и держать 100500 в дев-ветке, НО при следующем таком же слиянии (мердж--сквош) плодит кучу конфликтов (что логично, мердж-сквош, по сути, оставляет две ветки неслитыми)... либо надо при слиянии заодно делтаь "обратное слияние" - мастер в дев, чтобы синхронизировать ветки...
короче, я начинаю сам себя запутывать...
подскажите уже, как НЕ тащить все 100500 микрокоммитов в мастер? ))
Dmitry MiksIr, так, эту мысль понял, спасибо..
а более лайтового варианта паретащить из ориджина измененную историю - нет?
ну т.е., пуш--форсе - есть, а пулл--форсе - какбы нет?
UPD: reset --hard origin/myrebasedbranch - оно?
(или таким образом 100500 коммитов останутся невидимым мусором?)
1. Вообще-то гит как раз и предназначен для этого.
Работайте в фича-ветке, и пушьте изменения перед уходом.
2. Слегка оверхед, но поднимите где-нибудь виртуалку, поставьте весь нужный софт и работайте исключительно на виртуалке, подключаясь к ней откуда угодно.
1. видимо, так и придется в итоге сделать... избегал этого варианта. т.к. привык к тому, что все сохраняется на сервак автоматом, и я не забуду запушить изменения перед уходом (плюс, все эти шалости со stash тоже вошли в привычку)... но вы уже третий, кто к этому меня склоняет...
2. кстати, да, про этот вариант забыл... но я забыл написать, что время от времени работаю с ноута с херовым инетом, поэтому вряд ли подойдет...
в общем, пока лидирует вариант "не забывать коммитить/пушить"... видимо, придется менять привычки -))
кстати, насчет 1 варианта - а НБ нормально себя ведёт, если одновременно и git и "sync-on-save"? (пока не за своим компом, потестить завтра тока смогу)