Subversion: проверять только те файлы, которые были затронуты во время конкретной фиксации
В Subversion можно проверить только те файлы, которые были затронуты во время конкретной фиксации, если вы знаете конкретный номер версии?
Ответы
Ответ 1
Я думаю, что проверка Subversion может проверять только определенную папку, а не отдельные файлы. Тем не менее, команда:
svn log -r *revision* -q -v
отобразит изменения, связанные с указанной ревизией, чтобы вы могли обработать вывод этой команды, чтобы скопировать нужные файлы где-то после проверки рабочей папки для полного каталога.
Ответ 2
вы можете получить список файлов, измененных с момента следующей ревизии:
svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt
затем создайте script для проверки каждого файла в файле fileschanged.txt
Ответ 3
Я знаю это немного offtopic, но я использую TRAC для этого, и он экспортирует только файлы, измененные между двумя версиями, как zip-архив с файлами в их исходной структуре каталогов.
Ответ 4
Я думаю, что вы можете использовать термин "проверить" здесь в своем смысле CVS, то есть "обновление svn". Правильно ли это?
Если да, то вы можете обновить требуемую версию:
svn update -r12345
или даже только эти файлы для этой версии:
svn update -r12345 file1 file2 file3
хотя вам придется получить список файлов из svn, используя некоторые другие предложения.
Ответ 5
svn checkout
работает только на уровне каталога, а не на уровне файла. Конечно, если все изменения в конкретном наборе изменений были из одного и того же каталога, вы можете выполнить svn checkout <url> <path> -r<revid>
.
Ответ 6
Вы можете проверить список затронутых файлов с помощью svn log -q -v -r123 url
.
Если вы действительно хотите получить только те файлы, которые вы можете использовать svn cat urlToFile -r123 > myfile
для каждого файла.
Ответ 7
Если вы используете последнюю версию svn, вы можете проверить пустую папку, а затем обновить определенные файлы.
после получения списка выбранных файлов,
svn co --depth=empty url dest
cd dest
svn up file1 file2 file3
Изменить: почти то же решение, что и принятый здесь ответ: Оформить один файл из Subversion
Ответ 8
Вот один из способов сделать это.
svn co --depth empty svn://myrepository/mytrunk
cd mytrunk
svn diff -c [REVNUM] svn://myrepository/mytrunk | grep "Index:" | awk '{print $2}' | xargs -n 1 svn update --parents
Выход из однострочного файла awk представляет собой список файлов, измененных с помощью относительных путей. Как упоминалось ранее, обновление работает над отдельными файлами, а проверка работает над модулями. Параметр "--parents" заставляет, при необходимости, создавать каталоги в вашей рабочей копии.
Обратите внимание, что обновление также имеет параметр "-changelist" (по крайней мере, в версии 1.1.1.1 +), но, похоже, он не делал то, что я хотел.
Ответ 9
Мне нужно было сбросить все файлы, которые были изменены в пределах диапазона дюжины ревизий. Я сделал это так (эти команды могут быть не идеальными, это просто общее объяснение):
Создайте diff, который отобразит нужные вам файлы и запишет их в текстовый файл
svn diff --summarize -r219:232 > r219-232_Summary.txt
Это даст вам текстовый файл с строками типа
M path/to/file.php
Загрузите формат файла, чтобы заменить начало каждой строки командой "svn up" вместо "A" или "M" или что-то еще.
sed -i 's/A /svn up /g' ./r219-232_Summary.txt
..., который даст вам строки типа
svn up path/to/file.php
Создайте новый каталог и проверьте его проект
svn co http://www.repo.net/whatever
Удалите все в каталоге, кроме файла .svn(я использую относительно недавний клиент svn, поэтому, если вы на старом svn-клиенте, который имеет .svn в каждом каталоге, не знаете, как это будет работать)
rm -rf ./*
Скопируйте в свой текстовый файл, сделайте его исполняемым и запустите его как script.
cp /path/to/wherever/r219-232_Summary.txt ./r219-232_Summary.sh
chmod 777 ./r219-232_Summary.sh
./r219-232_Summary.sh
Если все идет так, как планировалось, то оболочка должна анализировать каждую команду "svn up" в вашем текстовом файле и заполнять каталог только теми файлами, которые вас интересуют.
Ответ 10
Вот простая версия bash script. Я использовал "шаблон поиска" для удаления ненужных строк. Версия, адрес репозитория и путь назначения указаны как аргументы, но могут быть жестко запрограммированы.
#!/bin/bash
REVISION=${1}
REPOSITORY="${2}"
DEST_PATH="${3}"
SEARCH_PATTERN="trunk"
FILES=$(svn log -q -v $REPOSITORY -r $REVISION | grep $SEARCH_PATTERN)
mkdir -p $DEST_PATH
for FILE in $FILES ; do
if [[ $FILE == *"$SEARCH_PATTERN"* ]]
then
FOLDER=$(dirname $FILE)
mkdir -p $DEST_PATH/$FOLDER
svn export -r $REVISION $REPOSITORY/$FILE $DEST_PATH/$FOLDER
fi
done
#EOF
Ответ 11
Вы можете получить только список файлов в конкретном изменении с помощью
svn log -v -q -r rev
Затем вы можете очистить маркеры на передней панели строки, например,
sed -e "s/^ . / /" | egrep -v "Changed paths:|-----"
. Чтобы получить только файлы, вы, вероятно, использовали бы svn cat
, как предложил Николай.
[отредактировано для очистки и упрощения седлового конвейера.]
Ответ 12
Извините, что воскресил давно мертвый вопрос, но мне никогда не отвечали на мое удовлетворение.
Вы можете создать простой инструмент для этого, используя SVNKit. Я нашел этот blog об этом и немного изменил код для моих нужд. Я использую его по сей день в процессе развертывания.
Это экспорт, а не проверка, но я уверен, что это будет простое изменение.
Ответ 13
svn mergeinfo --show-revs имеют право http://base.com.rev1 http://base.com.rev2
Это даст много изменений
Теперь вы хотели бы видеть список файлов в каждой ревизии.
Поэтому возьмите список ревизий и скопируйте их в блокнот или editplus и измените так, чтобы они вписывались в одну строку
svn log -r r33521 -r33762 -3456 -r5623 -q -v → missedFiles.txt
Примечание. У меня было 118 версий, и я не смог правильно получить список файлов. Поэтому я выполнил указанную выше команду, разбив на подмножества версии