Как можно проверить только те файлы, которые были изменены в ряде версий SVN? - PullRequest
0 голосов
/ 26 ноября 2008

Можно ли извлечь только те файлы из хранилища SVN, которые были изменены в ревизии или диапазоне ревизий, без проверки каких-либо файлов, которые не были изменены?

Ответы [ 8 ]

2 голосов
/ 26 ноября 2008

Мое предложение совпадает с предложением flolo. Но, занимает ряд. Вы могли бы следующую функцию оболочки.

function checkout_files_in_revrange()
{
  svn_url=$1;
  start_rev=$2;
  end_rev=$3;
  for theCheckoutCanditate in `svn log -r $start_rev:$end_rev --verbose --incremental | grep "   M " | cut -f5 -d' ' | cut -f3- -d/`
  do
     svn co $svn_url/$theCheckoutCandidate -q;
  done
}
2 голосов
/ 26 ноября 2008

Существует прямой способ получить только измененные файлы и не все. Afaik.

Моя идея заключается в следующем: использовать подробный вывод списка (который показывает последнюю измененную версию), отфильтровать его через awk и проверить остальные. Например. для поиска файлов, которые изменились в версии 42, я бы использовал это

VERSION=42
svn list -v -R -r $VERSION svn://... |  awk "/^[ ]*$VERSION/ {print \$7}" > files_to_checkout

А позже выполните svn update -r $VERSION 'cat files_to_checkout' (или co в URL, в зависимости от того, где вы будете запускать команду).

РЕДАКТИРОВАТЬ: дополнительные еще короче: используйте команду svn diff и замените на -x и --diff-cmd команду diff на svn co. Это требует некоторого взлома со сдвигом аргументов (который я не буду здесь подробно описывать), но для этого требуется всего одна строка, а не промежуточный файл (который вы могли бы также сохранить выше, но это стоило бы читабельности)

1 голос
/ 26 ноября 2008

Мы делаем это в скрипте MSBuild:

Шаг 1: - Используйте команду diff, чтобы получить список измененных файлов, перенаправить вывод во временный файл в целевом каталоге Шаг 2: - Считать временный файл в itemGroup

<Exec command="$(svnExecutable) diff -r $(StartRevision):$(EndRevision) $(DOUBLE_QUOTES)$(SvnRepositoryPath)/$(DOUBLE_QUOTES) --no-diff-deleted --summarize &gt; $(TempFilePath)" WorkingDirectory="$(WorkDirectory)" />

1 голос
/ 26 ноября 2008

Если вы используете svn log с параметром -v (подробный вариант):

svn log -r <revision> -v <path>

Вы получите вывод, содержащий измененные файлы:

 r3 | ciaran | 2008-11-16 12:24:30 +0000 (Sun, 16 Nov 2008) | 1 line
Changed paths:
   A /trunk/apache/apache.conf
   A /trunk/application/controllers

Commit message goes here

Вы должны иметь возможность манипулировать этим с некоторой подсказкой и т. Д. Для получения последовательности команд svn co.

0 голосов
/ 06 июля 2012

svn diff -r начальная_резания: окончательная_рекция_или_HEAD --суммаризировать

0 голосов
/ 20 января 2009

Почти в тех же строках, которые предлагали большинство людей (но только в системе с grep и awk), вы можете получить список, выполнив

svn log -v --revision <revision_number> | grep "^ " | awk '{print $2}'.

0 голосов
/ 26 ноября 2008

Еще один ответ на ваш вопрос:

Предполагая, что у вас уже есть рабочая копия, вы должны просто использовать 'svn update' в корне каталога, содержащего просматриваемые вами файлы, поскольку он точно определяет, что изменилось между вашей текущей версией и версией HEAD с наименьшим количеством данных.

Старые системы управления исходным кодом, такие как CVS и VSS, запрашивали у сервера каждый файл изменился ли этот файл? , в то время как Subversion просто отправляет изменения дерева как одно действие. Когда вы передаете список файлов в svn update, у вас нет этого преимущества.

Поэтому самый эффективный способ передать то, что изменилось, это просто обновить. Это только передает двоичный diff изменений в HEAD по сравнению с базовой версией вашей рабочей копии.


Если проблема, которую вы пытаетесь решить, заключается в том, что svn update идет медленно, то мы пытаемся решить эту проблему для Subversion 1.7.

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

0 голосов
/ 26 ноября 2008

Я не совсем уверен, возможно ли это, но вы также можете сделать что-то вроде этого:

svn checkout --revision <revisionNumber> 

чтобы получить определенную ревизию и

svn log --revision <revisionNumber> 

для просмотра списка всех файлов, отредактированных в ревизии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...