Проблемы с управлением исходным кодом SVN при объединении изменений - PullRequest
1 голос
/ 12 февраля 2010

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

x++

В конечном итоге, как это:

x++
x++

где из-за вставки / удаления возвратов каретки (я думаю) одна строка стала незаметно объединяться в две строки одного и того же кода (без конфликтов) Все компилируется, но тесты неожиданно заканчиваются неудачно и возникает странное поведение.

Должно ли это быть возможным? Как мне защититься от этого?

Ответы [ 4 ]

2 голосов
/ 12 февраля 2010

Чтобы избежать проблем слияния из-за окончания строки, просто установите для этих файлов свойство svn: eol-style .

1 голос
/ 12 февраля 2010

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

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

Кроме того, небольшой тест показывает, что SVN достаточно умен, чтобы избежать конфликта, если объединяемые изменения уже применены.

Следующий пример (предупреждение, портится с текущим каталогом; требуется Unix-подобные инструменты) имитирует ситуацию, которую вы только что описали.

# Initialize repository
svnadmin create repo
REPO_URL="file:///$PWD/repo"
svn mkdir "$REPO_URL/trunk" "$REPO_URL/branches" -m "Initialize repository structure"

# Add main program
svn co "$REPO_URL" wc1
cd wc1/trunk
cat > main.pl << "EOF"
my $x=0;
print("$x\n");
EOF
svn add main.pl
svn ci -m "Add main.pl"
cd ../..

# Create branch
svn cp "$REPO_URL/trunk" "$REPO_URL/branches/exp" -m "Create \"exp\" branch"

# Branch developer makes a change
svn co "$REPO_URL" wc2
cd wc2/branches/exp
perl -i -wpe 'print("\$x++;\n") if $. == 2' main.pl
svn ci -m "Increment x"
cd ../../..

# Trunk developer makes the same change
cd wc1/trunk
perl -i -wpe 'print("\$x++;\n") if $. == 2' main.pl
svn ci -m "Increment x"

# Merge changes from branch
svn up
svn merge --reintegrate "$REPO_URL/branches/exp" .
cat main.pl
1 голос
/ 12 февраля 2010

Я видел это, когда слияния произошли неправильно, и кто-то разрешил конфликт, удалил две версии слияния и зафиксировал основной файл, в котором все еще объединены обе версии (как вы должны сказать SVN, что правильно .)

1 голос
/ 12 февраля 2010

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

Вы можете защититься от этого, проверив различия до фактического совершения и автоматически (как вы уже сделали).

Можете ли вы воспроизвести это поведение?

...