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