Я работаю над новой структурой weave для хранения истории управления версиями. Это, несомненно, вызовет некоторые религиозные войны о том, является ли это правильным способом делать вещи, когда он выходит, но это не мой вопрос прямо сейчас.
Мой вопрос связан с тем, что должен дать вывод blame. Когда строка кода была добавлена, удалена и объединена в себя несколько раз, не всегда ясно, какая ревизия должна винить в ней. Примечательно, что это означает, что, когда раздел кода удаляется, все записи о нем были там, и нет никакой вины для удаления. Каждый, с кем я столкнулся с этой проблемой, сказал, что попытка сделать лучше просто не стоит того. Иногда люди помещают в хак, что строка после того, как раздел, который был удален, изменил свою вину с того, что было на самом деле, до пересмотра, когда раздел был удален. Предположительно, если раздел находится в конце, последняя строка получит свою вину, и если файл обрывается, тогда вина действительно исчезает в эфире, потому что там буквально нигде не осталось информации о вине. По различным техническим причинам я не буду использовать этот хак, но предположу, что продолжение, но с этим полностью документирована, но де-факто стандартной практикой будет непротиворечивой (но не стесняйтесь пылать меня и получить его из вашей системы).
Перейдем к моему актуальному вопросу. Обычно в вине за каждую строку вы смотрите на полную историю того, где она была добавлена и удалена в истории, и с помощью трехстороннего слияния (или, в случае перекрестных слияний, случайной ерунды) и на основе отношений между этими вы определяете, должна ли линия быть там в зависимости от ее истории, и если это не так, но тогда вы отмечаете ее как новую с текущей ревизией. В случае, когда линия встречается у нескольких предков с разными винами, она выбирает, какой из них наследовать произвольно. Опять же, я полагаю, что продолжение этой полностью недокументированной, но фактической стандартной практики будет бесспорным.
В тех случаях, когда моя новая система расходится в том, что вместо того, чтобы делать сложный расчет того, должна ли данная строка находиться в текущей ревизии, основываясь на сложном вычислении всей истории, она просто смотрит на ближайших предков, и если строка в любом из них он выбирает произвольный, чтобы наследовать вину. Я делаю это изменение в основном по техническим причинам (и вполне возможно, что другие реализации вины делают то же самое, по аналогичным техническим причинам и из-за отсутствия заботы), но, подумав об этом, часть меня фактически предпочитает новое поведение как будучи более интуитивным и предсказуемым, чем старый. Что думают все?