Да, вы правы, что Subversion имеет эту проблему. На самом деле, это еще хуже , чем вы думаете. Subversion работает отдельно для каждого файла, когда определяет, устарела ли ваша рабочая копия. Таким образом, вы можете в конечном итоге с
A изменяет значения по умолчанию в foo()
и повторно запускает эксперимент. Допустим, изменения влияют только на results/output-0001.dat
.
A фиксирует это как SVN ревизия 2.
B пересматривает другую часть кода и генерирует новые результаты. Поскольку B не отличается от A, при перезапуске изменяется только results/output-1000.dat
.
B фиксирует это как SVN ревизия 3.
B может зафиксировать без обновления в первую очередь, поскольку сделанные им изменения не пересекаются с изменениями, сделанными A. Более того, редакция 3 SVN не соответствует рабочей копии на машине А или B! Если профессор C приходит и проверяет версию 3 SVN, он видит:
results/output-0001.dat
с результатами А и
results/output-1000.dat
с результатами B.
Это очень противоречиво.
Базовая концепция, которая допускает это, - рабочих копий смешанной ревизии . Subversion позволяет вам иметь файлы в различных ревизиях в вашей рабочей копии. Когда вы создаете редакцию 2 с изменением foo.c
, этот файл помечается как находящийся в редакции 2. Другие файлы в рабочей копии остаются в редакции 1. Это позволяет вам выборочно обновить часть вашей рабочей копии обратно до старая редакция для целей отладки, и она позволяет фиксировать файлы без обновления, если никто не трогал файл.
Такие инструменты, как Mercurial и Git, не позволят вам сделать это, поскольку они моделируют историю как DAG (направленный ациклический граф). Каждое изменение становится новым узлом на графике, и вы должны сделать явный коммит слияния для объединения двух наборов изменений. В приведенном выше сценарии B попытается отменить изменения, а Mercurial прекратит работу. Затем он делает
$ hg pull
$ hg merge # he now has both his own and A's changes to the code
$ run-experiment
$ hg commit -m "Merge with new results"
Все три версии результатов теперь хранятся в истории.