При использовании svn: externals обычно плохая идея использовать внешний без номера ревизии. Это означает, что становится трудно соотносить версию внешнего с версией содержащего проекта; Я знаю этот трудный путь, от попытки отследить некоторую историю в проекте, который содержал внешние элементы, и я должен был бы предположить, какая ревизия соответствовала ревизии в содержащем проекте (иногда это было раньше, потому что кто-то обновил внешний проект затем обновлял содержащий проект, иногда это было позже, потому что кто-то отредактировал файлы непосредственно во внешней проверке, а затем зафиксировал его).
Вместо этого, как подсказывает подсказка пара абзацев в разделе externals в книге о подрывной деятельности , вы всегда должны фиксировать внешние элементы с номером ревизии. Таким образом, всякий раз, когда вы извлекаете конкретную ревизию содержащего проекта, будет также извлечена соответствующая ревизия внешнего. Это означает немного больше работы, так как вам нужно каждый раз обновлять номер редакции в свойстве svn: externals (мы написали скрипт для этого автоматически), но в долгосрочной перспективе это гораздо лучшее решение.
edit : Вот скелет скрипта, который мы использовали (задача rake) для удобного обновления внешнего и поддержания всего синхронизированного.
desc 'Update external for this project (rake update_external r=17789)'
task :update_external do |t|
rev = ENV['r']
rev =~ /^\d+$/ or raise "Invalid SVN revision number: r=<#{rev}>"
# Update the project.
sh "svn update"
URL = 'svn+ssh://example.com/external/trunk'
sh "svn propset svn:externals 'external -r#{rev} #{URL}' containing/directory"
# Update again -- to put the externals back to the right revision.
sh "svn update"
end