Можно ли извлечь из репозитория SVN только те файлы, которые были изменены в ревизии или диапазоне ревизий, без проверки файлов, которые не были изменены?
Как можно извлечь только файлы, которые были изменены в диапазоне ревизий SVN?
Ответы (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
}
Теперь есть прямой способ получить только измененные файлы, а не все.
Моя идея заключалась бы в следующем: используйте подробный вывод списка (который показывает последнюю измененную версию), отфильтруйте его через 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. Это требует некоторого взлома с изменением аргумента (который я не буду здесь подробно описывать), но нужна только одна строка и не промежуточный файл (который вы также могли бы сохранить выше, но это потребовало бы удобочитаемости)
Если вы используете 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.
Мы делаем это в скрипте MSBuild:
Шаг 1: - Используйте команду diff для получения списка измененных файлов, перенаправьте вывод во временный файл в целевом каталоге. Шаг 2: - Прочтите временный файл в itemGroup.
<Exec command="$(svnExecutable) diff -r $(StartRevision):$(EndRevision) $(DOUBLE_QUOTES)$(SvnRepositoryPath)/$(DOUBLE_QUOTES) --no-diff-deleted --summarize > $(TempFilePath)" WorkingDirectory="$(WorkDirectory)" />
Я не совсем уверен, возможно ли это, но вы также можете сделать что-то вроде этого:
svn checkout --revision <revisionNumber>
получить определенную доработку и
svn log --revision <revisionNumber>
чтобы перечислить все файлы, измененные в ревизии
Почти в тех же строках, что и предлагали большинство людей (но только в системе с grep и awk), вы можете получить список, выполнив
svn log -v --revision <revision_number> | grep "^ " | awk '{print $2}'
.
Еще один вариант ответа на ваш вопрос:
Предполагая, что у вас есть существующая рабочая копия, вы должны просто использовать 'svn update' в корне каталога, содержащего файлы, которые вы просматриваете, поскольку это извлекает именно то, что изменилось между вашей текущей ревизией и ревизией HEAD, с наименьшим возможным количеством данных.
Старые системы управления исходным кодом, такие как CVS и VSS, запрашивали у сервера каждый файл, был ли этот файл изменен?, в то время как Subversion просто отправляет изменения дерева как одно действие. Когда вы передаете список файлов в svn update, у вас нет этого преимущества.
Поэтому самый эффективный способ передать то, что изменилось, - это просто обновить. Это переносит только двоичную разницу изменений в HEAD по сравнению с базовой версией вашей рабочей копии.
Если проблема, которую вы пытаетесь решить, заключается в том, что svn update работает медленно, то мы пытаемся решить эту проблему для Subversion 1.7.
В этой версии будет представлен новый формат хранения данных рабочей копии, который сделает простые операции, которые должны блокировать всю рабочую копию (например, обновление), намного быстрее.
svn diff -r start_revision: end_revision_or_HEAD --summarize