VCS пошли куда-то не туда

May 22, 2019 19:06

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

Squashing commits via the command line using "git merge - squash" is just another time consuming step. That's why we have an option to allow Git users to automatically squash commits in feature ( Read more... )

vcs, мысли вслух

Leave a comment

coctic May 23 2019, 13:58:40 UTC
Какое же тут вырождение? Как раз наоборот, у тебя есть много репозиториев, никто не мешает обмениваться коммитами с матюками и экспериментами, да и самому можно держать несколько репозиториев, вся распределенность сохраняется. Можно держать, например, приватный репозиторий для группы разработчиков, где вести себя расслабленно, и публичный (или апстрим), куда выкатывать уже красивую историю. Как я понимаю, с SVN такое невозможно, там удаленный репозиторий единственный в принципе.

Нет, в публичном репозитории НИКОГДА нельзя менять историю. Если точнее, можно менять историю только у тех коммитов, про которые ты уверен, что их никто себе не скачал, ну или ты точно знаешь, что скачавший их готов к тому, что история может меняться, и знает, как чинить последствия. При повторном пулле из репозитория с подчищенной историей происходят разные неприятные штуки, поэтому так лучше не делать.

Изменение истории происходит не в момент пуша, а до него. Пуш идет уже на измененной истории.

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

Reply

victor_sudakov May 23 2019, 14:21:33 UTC
Изменение истории происходит не в момент пуша, а до него. Пуш идет уже на измененной истории.

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

Нет, в публичном репозитории НИКОГДА нельзя менять историю. Если точнее, можно менять историю только у тех коммитов,

Значит будут менять, соблазн "подчистить летописи" всегда слишком велик.

Reply

coctic May 23 2019, 19:26:34 UTC
"А если я не хочу модифицировать историю в своём личном репозитории? Если я хочу непременно сохранить все свои борения, ошибки и матюки, но вынужден прятать их от попадания в публичный репозиторий, то как я должен действовать?"
Если ты не хочешь менять историю, то можешь сделать еще одну ветку, туда слить изменения, потом на ней уже отредактировать историю и запушить ее. Собственно, git merge --squash, которым ты возмущаешься - это ровно оно.

"Значит будут менять, соблазн "подчистить летописи" всегда слишком велик."
1. Это очень хорошо видно (у всех, кто успел слить себе старые изменения, поломается нормальная работа), и следы, по которым все можно восстановить, остаются.
2. Хозяин репозитория может запретить менять историю в своем репозитории.
3. В централизованных системах такая возможность тоже есть, svndumpfilter. например.

Reply

victor_sudakov May 24 2019, 06:45:04 UTC
Если ты не хочешь менять историю, то можешь сделать еще одну ветку, туда слить изменения, потом на ней уже отредактировать историю и запушить ее.

Звучит неплохо и довольно безобидно. Типа черновик и чистовик. Почему тогда ты говоришь, что эти инструменты "довольно хрупкие и легко ломаются, требуется изрядная дисциплина при их использовании"?

3. В централизованных системах такая возможность тоже есть, svndumpfilter. например.

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

Reply

coctic May 24 2019, 07:11:27 UTC
Почему тогда ты говоришь, что эти инструменты "довольно хрупкие и легко ломаются, требуется изрядная дисциплина при их использовании"?
Потому что при этом теряется связь между исходными коммитами и новыми, с измененной историей. С точки зрения VCS - это совершенно не связанные между собой изменения. Вся связь - у тебя в голове (в коммит логах). Соответственно, теряется защита от, например, повторного применения какого-то изменения. Средства для поддержки такого образа действий есть, но они появились поздно и прикручены несколько сбоку. Но это мое личное мнение, я неуверенно себя в таком варианте чувствую, много команд живет с таким воркфлоу, и неплохо.

Это всё же другое, на живом репозитории это сделать нельзя, только при клонировании репозиториев.
Ну никто не мешает склонировать репозиторий и подменить им исходный. Я, может, скажу крамольную, вещь, но если у тебя есть доступ к файлам репозитория на диске, то ты там можешь наворотить чего угодно, и никто тебе не сможет помешать. Собственно, повторюсь, если в гите отредактировать историю в публичном репозитории, то если хоть кто-то до редактирования успел эту историю стащить к себе (pull сделать), то он:
- сразу увидит, что было сделано что-то необычное
- сможет восстановить (у себя, локально) состояние до этого редактирования.

Так что смысл редактирования как "подчистить летописи" теряется подчистую.

А если никто до исправления в репозиторий заглянуть не успел, то и какая разница.

Reply

victor_sudakov May 24 2019, 08:05:17 UTC
Потому что при этом теряется связь между исходными коммитами и новыми, с измененной историей. С точки зрения VCS - это совершенно не связанные между собой изменения. Вся связь - у тебя в голове.

О. А вот это плохо. Наверное против этого я и возмущаюсь. Я бы тоже неуверенно чувствовал.

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

Почему я и предлагаю не рассматривать эти действия в нашем разговоре. Давай обсуждать только то, что можно сделать штатным клиентом hg, git и пр. (типа rebase, histedit и пр).

А если никто до исправления в репозиторий заглянуть не успел, то и какая разница.

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

Reply

coctic May 24 2019, 08:32:27 UTC
О. А вот это плохо. Наверное против этого я и возмущаюсь. Я бы тоже неуверенно чувствовал.
Скажем так. Есть несколько возможных сценариев черновик-чистовик
1. Черновик - он почти идеален, и в момент пуша его надо только подновить с учетом того, что в репозитории что-то успело произойти с момента содания ветки-черновика.
2. Черновик неидеален, но перед тем, как запушить изменения, ты черновик редактируешь или копируешь в чистовик, и дальше старый черновик не используешь, если нужна дальнейшая доработка - создается новый черновик на основании запушенного чистовика, и все по кругу.
3. Черновик неидеален, но ты его не выбрасываешь, на основе его копии делаешь чистовик, а затем продолжаешь разработку в старом черновике, и в какой-то момент делаешь новый чистовик на основе нового черновика, часть которого уже один раз ушла в репозиторий.

Сценарии 1-2 поддерживаются хорошо, с ними проблем нет. Проблемы могут быть только с 3 сценарием, когда фактически у тебя растет 2 ветки с одними и теми же изменениями, но по-разному упакованными в набор коммитов. Тут сложно, хотя средства тоже есть.

Давай обсуждать только то, что можно сделать штатным клиентом hg, git и пр. (типа rebase, histedit и пр).
Это некоторое лукавство. repocopy в CVS - это штатно или нет? Если какой-то возможности в старой системе штатно нет, и не появится, т.к. по факту развитие остановилось, как-то странно считать это преимуществом. Но окей, давай будем только про штатные средства.

Мне больше нравится, когда история считается indelible (как любят выражаться в документации к hg. Хотя и в hg есть расширения для всех этих возмутительных надругательств над историей).
Тут вопрос отношения, а не техники. Как по-моему, если я не могу сделать приватный репозиторий с грязной историей, а потом удобно ее привести к приличному виду перед передачей на публику (сделать патч и приложить его отдельным коммитом можно всегда, но это неудобно), это изрядно уменьшает набор потенциальных сценариев использования. Tools, not policy, не? В конце концов, если тебе редактирование истории так поперек горла, есть хуки, которыми можно все тебя не устраивающее запретить.

Кстати, технически после надругательства над историей вся старая версия в репозитории остается, и есть штатные средства ее увидеть. Правда, т.к. это получается "изолированная" ветка, никак не связанная с основной историей, через некоторое время ее таки уберет garbage collector. Я как-то после экспериментов занимался таким восстановлением репозитория, это вполне посильная вещь.

Reply

victor_sudakov May 24 2019, 09:48:52 UTC
Это некоторое лукавство. repocopy в CVS - это штатно или нет?

Нештатно конечно. Средствами /usr/local/bin/cvs этого никак не сделать.

Reply


Leave a comment

Up