Ошибка слияния SVN «должна быть связана с предками», даже если файлы были ранее объединены - PullRequest
0 голосов
/ 02 сентября 2018

Описание проблемы

У меня есть SVN-репозиторий для моих скриптов. Недавно я заметил, что большинство моих скриптов содержат много общих фрагментов кода (например, параметры синтаксического анализа), поэтому я решил создать простой скрипт, который будет использоваться в качестве шаблона. Затем я смогу использовать svn copy для создания новых скриптов из него. Это позволит мне вносить улучшения только в файл шаблона и применять изменения ко всем сценариям с помощью команды svn merge.

Теперь я хотел бы связать уже существующий скрипт с шаблоном, чтобы я тоже мог svn merge на них. Я попробовал команду svn merge -r 0:HEAD ^/template ./old-script. Казалось, работает. Он записал правильно выглядящий mergeinfo. К сожалению, SVN до сих пор не понимает, что эти файлы должны быть связаны. Когда я пытаюсь выполнить svn merge ^/template ./old-script для передачи некоторых новых изменений, SVN показывает ошибку: svn: E195016: 'svn://localhost/test/template@42' must be ancestrally related to 'svn://localhost/test/old-script@41'.

Как я могу сказать SVN обращаться с old-script так, как если бы оно было svn copy с template?

Шаги для воспроизведения

Я подготовил сценарии POSIX, которые воспроизводят эту ситуацию в новом хранилище:

#!/bin/sh

printf 'Creating unrelated files...\n'
printf 'aaa\n' >./aaa
printf 'bbb\n' >./bbb
svn add ./aaa ./bbb
svn commit --message 'Created unrelated files.'

printf '\nMaking change in aaa so it can be merged to bbb...\n'
printf 'aaa\n' >>./aaa
svn commit --message 'Changed aaa.'

printf '\nMerging aaa to bbb...\n'
svn merge ^/aaa ./bbb --revision 0:HEAD --accept=postpone
printf 'aaa\nbbb\n' >./bbb
svn resolve --accept=working ./bbb
svn commit --message 'Merged aaa to bbb. Files should be related now.'

printf '\nMaking another change in aaa...\n'
printf 'aaaaaa\n' >>./aaa
svn commit --message 'Changed aaa again.'

printf '\nPrinting mergeinfo of bbb...\n'
svn propget svn:mergeinfo ./bbb

printf '\nTrying to merge aaa to bbb again...\n'
svn merge ^/aaa ./bbb  # Why is it not working?

Запуск этого скрипта дает следующий результат:

Creating unrelated files...
A         aaa
A         bbb
Adding         aaa
Adding         bbb
Transmitting file data ..done
Committing transaction...
Committed revision 1.

Making change in aaa so it can be merged to bbb...
Sending        aaa
Transmitting file data .done
Committing transaction...
Committed revision 2.

Merging aaa to bbb...
--- Merging r2 into 'bbb':
C    bbb
--- Recording mergeinfo for merge of r2 into 'bbb':
 U   bbb
Summary of conflicts:
  Text conflicts: 1
Resolved conflicted state of 'bbb'
Sending        bbb
Transmitting file data .done
Committing transaction...
Committed revision 3.

Making another change in aaa...
Sending        aaa
Transmitting file data .done
Committing transaction...
Committed revision 4.

Printing mergeinfo of bbb...
/aaa:2

Trying to merge aaa to bbb again...
svn: E195016: 'svn://localhost/test/aaa@4' must be ancestrally related to 'svn://localhost/test/bbb@3'

Я нашел эту информацию в svnbook :

Если отслеживание слияний активно, то Subversion будет внутренне отслеживать метаданные (то есть свойство svn: mergeinfo) об операциях слияния, когда два источника слияния связаны по наследству - если первый источник предок второго или наоборот - это гарантированно будет случай при использовании первых двух форм. Subversion также примет существующие метаданные слияния в целевой копии рабочей копии в учетную запись при определении, какие ревизии объединить и чтобы избежать повторять слияния и ненужные конфликты, это может только слить подмножество запрошенные диапазоны.

Похоже, что свойство mergeinfo указывает на то, что файлы связаны с наследством.

...