Статьи

Извлечение отображений веток Subversion

Subversion была огромным облегчением по сравнению с CVS, когда она вышла. Я был рад, в Codehaus (RIP), чтобы иметь возможность использовать его задолго до того, как он добрался до v1.0. Конечно, он также преследовал набор функций Perforce, и не просто превосходил CVS. По крайней мере, мне так показалось, так как я использовал Perforce в конце 90-х.

Google только что объявил, что они больше не используют Perforce для своего мега-ствола / monorepo. Можно только догадываться, что масштаб, который был разработан для Perforce, достаточно хорош практически для любой компании в мире, за исключением Google.

В любом случае, у Subversion и Perforce есть общие черты, которых у Git нет по умолчанию, что весьма полезно с точки зрения управления:

  • Разрешения для каждой ветви и каталога
  • Не захлебнется большими двоичными файлами
  • Не задохнется от веса истории (даже оттока на больших двоичных файлах)
  • Возможность поднабора проверки (клиент-спецификация в P4 и разреженные проверки в Svn)
  • Произвольные отображения ветвей — хотя Subversion не такие мелкие, как Perforce

В последнем случае отображения ветвей в Perforce совместно используют грамматику конфигурации в виде клиентских спецификаций, что позволяет легко скрывать друг друга. Для дополнительной информации обратитесь к Googlers Subset их Trunk .

Хорошо, хватит буллического сравнения. Subversion не имеет проверяемого списка отображений ветвей. Все же. Что я действительно хочу, так это svn branch-mappingsвыложить то, что я ищу, или, что еще лучше, сгенерированный файл «.branch_mappings.txt», чтобы я мог его просмотреть. С помощью почтового списка разработчиков Subversion я могу перепроектировать последний. Сделайте это в скрипте Bash:

svn up -q
repoRoot=$(svn info | grep "^URL: " | sed "s/URL: //")
rm -f .branch_mappings.txt
for f in *; do 
  svn ls "$repoRoot/$f" --depth immediates > .immediates
  while read p; do
    svn -q log --verbose --stop-on-copy "$repoRoot/$f/$p" -r1:HEAD -l1 2>&1 | grep " (from " | grep  "^   A " | sed "s/^   A //" | sed "s/ (from /::/" | sed "s/:[[:digit:]]*)$//" >> .branch_mappings.txt
  done <.immediates
done
cat .branch_mappings.txt | sort | uniq | sponge .branch_mappings.txt
svn add .branch_mappings.txt
svn commit -m "branch mappings changed"

(сначала убедитесь, что вы установили «губку»)

ВНУТРЕННЯЯ проверка, выполняемая с svn co REPO-ROOT subversion --depth immediatesтем же сценарием, который выполняется ночью через Дженкинса.

Если вы заставляете Дженкинса выполнять извлечение / обновление, убедитесь, что он подчиняется --depthпараметру, поскольку вы действительно не хотите бессмысленно заполнять жесткий диск всеми перестановками branch, tag, dir и file. Есть ограничение — если вы сделали ветку svn copy FROM_URL TO_URLглубже в структуре dir, чем две глубже от root, вышеприведенный скрипт не найдет ее для ее перечисления.

Вот сопоставления веток для Zookeeper ( svn co http://svn.apache.org/repos/asf/zookeeper/ --depth immediates), выполненные вышеприведенным скриптом. После первоначальной проверки потребовалось 90 секунд.

/zookeeper/branches/branch-3.4::/zookeeper/trunk
/zookeeper/branches/branch-3.5::/zookeeper/trunk
/zookeeper/branches::/hadoop/zookeeper/branches
/zookeeper/dist::/hadoop/zookeeper/dist
/zookeeper/legacy-site::/hadoop/zookeeper/site
/zookeeper/logo::/hadoop/zookeeper/logo
/zookeeper/tags/release-3.3.3-rc0::/zookeeper/branches/branch-3.3
/zookeeper/tags/release-3.3.3::/zookeeper/tags/release-3.3.3-rc1
/zookeeper/tags/release-3.3.4::/zookeeper/tags/release-3.3.4-rc0
/zookeeper/tags/release-3.3.5-rc0::/zookeeper/branches/branch-3.3
/zookeeper/tags/release-3.3.5::/zookeeper/tags/release-3.3.5-rc1
/zookeeper/tags/release-3.3.6::/zookeeper/tags/release-3.3.6-rc0
/zookeeper/tags/release-3.4.0-rc0::/zookeeper/branches/branch-3.4
/zookeeper/tags/release-3.4.0-rc1::/zookeeper/branches/branch-3.4
/zookeeper/tags/release-3.4.0::/zookeeper/tags/release-3.4.0-rc2
/zookeeper/tags/release-3.4.1::/zookeeper/tags/release-3.4.1-rc0
/zookeeper/tags/release-3.4.2::/zookeeper/tags/release-3.4.2-rc0
/zookeeper/tags/release-3.4.3::/zookeeper/tags/release-3.4.3-rc0
/zookeeper/tags/release-3.4.4::/zookeeper/tags/release-3.4.4-rc0
/zookeeper/tags/release-3.4.5-rc0::/zookeeper/branches/branch-3.4
/zookeeper/tags/release-3.4.5::/zookeeper/tags/release-3.4.5-rc1
/zookeeper/tags/release-3.4.6::/zookeeper/tags/release-3.4.6-rc0
/zookeeper/tags/release-3.5.0::/zookeeper/tags/release-3.5.0-rc0
/zookeeper/tags/release-3.5.1-rc0::/zookeeper/branches/branch-3.5
/zookeeper/tags/release-3.5.1-rc1::/zookeeper/branches/branch-3.5
/zookeeper/tags/release-3.5.1-rc2::/zookeeper/branches/branch-3.5
/zookeeper/tags/release-3.5.1-rc3::/zookeeper/branches/branch-3.5
/zookeeper/tags/release-3.5.1::/zookeeper/tags/release-3.5.1-rc4
/zookeeper/tags::/hadoop/zookeeper/tags
/zookeeper/trunk::/hadoop/zookeeper/trunk

Google и Facebook якобы сотрудничают в модификациях Mercurial, чтобы позволить ему работать в дизайне мега-ствола / моно-репо. Всегда интересно видеть соревнование в пространстве SCM 🙂