Как найти общего предка двух веток в SVN? - PullRequest
10 голосов
/ 25 октября 2010

Представьте, что у вас есть большое дерево SVN с ветвями повсюду.Есть ствол, есть ветви, эти ветви имеют ветви и т. Д. Итак, учитывая две ветви в дереве, как вы можете найти общего предка?

Я знаю, что вы могли бы просто взять полный журнал исравните его, но он становится немного медленным, если в вашей стволе 75 000 ревизий (и большую часть времени вы сравниваете ствол с другой, возможно, далекой, ветвью).

Процесс будет автоматизирован, поэтому вы можете предлагать некоторые вещикоторые не легко сделать вручную.

Добавлено: Забыл сказать, мне нужно сделать это в режиме реального времени.Не в «реальном времени», как в 10 мс, а в «реальном времени», как в «до того, как человек, ожидающий выхода, будет раздражен».Так что было бы неплохо, если бы оно было меньше 10 секунд.

Ответы [ 4 ]

9 голосов
/ 25 октября 2010

Я думаю, это то, что вам нужно

svn log -v --stop-on-copy

вернет ниже

r43477 | имя пользователя | 2010-09-21 13:19:58 +0530 (вт, 21 Сентябрь 2010) | 1 строка Измененные пути: A / багажник / ре / XXX (из / Филиалы / выпуск / post_XXX / повторное / XXX: 43476)

Отсюда вы можете определить, что эта ветвь является предком текущей ветка. Если вы объедините эту логику, упомянутую Виктором Николле, вы сможет получить результаты в режиме реального времени.

2 голосов
/ 25 октября 2010

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

В следующий раз вы сможете возобновить работу с последней обработанной вами ревизии.

1 голос
/ 18 ноября 2016

В поисках эквивалента в svn для git merge-base я попал в этот пост. Там до сих пор нет простого способа обойти это?

Тогда вот одно из возможных решений: Клонируйте репозиторий с помощью git-svn, запустите git-merge-base , предоставив оба пакета. Voila!

1 голос
/ 08 августа 2012

Уже немного поздно для ОП, но мне нужно было то же самое, и я не мог найти ответ. Следующий скрипт Powershell работает для меня.

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

param ([string]$path1, [string]$path2, [int]$rev = 0)

if ($path1 -eq "" -or $path2 -eq "") { "Specify two svn paths to compare."; break }

$revs1 = new-object System.Collections.Generic.List``1[System.Int32]
svn log -r HEAD:$rev $path1 | %{ if ($_ -match "^r(\d+)") { $revs1.Add($matches[1]) } }

$revs2 = new-object System.Collections.Generic.List``1[System.Int32]
svn log -r HEAD:$rev $path2 | %{ if ($_ -match "^r(\d+)") { $revs2.Add($matches[1]) } }

$i1 = 0
$i2 = 0

while ($true) {
  if ($revs1[$i1] -eq $revs2[$i2]) { $revs1[$i1]; break }
  elseif ($revs1[$i1] -gt $revs2[$i2]) { do { $i1 += 1} until ($i1 -eq $revs1.Count -or $revs1[$i1] -le $revs2[$i2]) }
  else { do { $i2 += 1} until ($i2 -eq $revs2.Count -or $revs2[$i2] -le $revs1[$i1]) }
  if ($i1 -eq $revs1.Count -or $i2 -eq $revs2.Count) { "No common base revision found - try increasing limit."; break }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...