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

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


person xenox    schedule 26.11.2008    source источник


Ответы (8)


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

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
}
person Shyam    schedule 26.11.2008
comment
Он не работает, если в каталогах или файлах есть пробелы - person Parasu; 05.10.2016

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

Моя идея заключалась бы в следующем: используйте подробный вывод списка (который показывает последнюю измененную версию), отфильтруйте его через 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. Это требует некоторого взлома с изменением аргумента (который я не буду здесь подробно описывать), но нужна только одна строка и не промежуточный файл (который вы также могли бы сохранить выше, но это потребовало бы удобочитаемости)

person flolo    schedule 26.11.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

Вы должны иметь возможность манипулировать этим с помощью grepping и т. Д., Чтобы создать последовательность команд svn co.

person Ciaran McNulty    schedule 26.11.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)" />

person user41040    schedule 26.11.2008
comment
Извините, вставка кода не сработала, как планировалось - если кто-то хочет, добавьте комментарий здесь - person user41040; 26.11.2008

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

svn checkout --revision <revisionNumber> 

получить определенную доработку и

svn log --revision <revisionNumber> 

чтобы перечислить все файлы, измененные в ревизии

person Drejc    schedule 26.11.2008
comment
Это всегда будет относиться ко всем файлам данной ревизии (т.е. для файлов, не измененных в данной версии, он предоставит вам последнюю версию) - person flolo; 26.11.2008

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

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

person Shyam    schedule 20.01.2009

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

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

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

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


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

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

person Bert Huijben    schedule 26.11.2008
comment
Я думаю, что проблема, которая решается, заключается в создании «набора патчей» для измененных файлов или zip-архива изменений для отправки кому-нибудь. - person gbjbaanb; 02.02.2011

svn diff -r start_revision: end_revision_or_HEAD --summarize

person Alex Robinson    schedule 05.07.2012