Subversion: проверить только те файлы, которые были затронуты во время определенного коммита - PullRequest
16 голосов
/ 09 июня 2009

В Subversion возможно ли извлекать только тех файлов, которые были затронуты во время конкретной фиксации, при условии, что вы знаете конкретный номер ревизии?

Ответы [ 13 ]

12 голосов
/ 09 июня 2009

Я думаю, что проверка Subversion может проверять только определенную папку, а не отдельные файлы. Тем не менее, команда:

svn log -r *revision* -q -v

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

4 голосов
/ 05 октября 2011

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

svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt

затем создайте сценарий для извлечения каждого файла в filesloaded.txt

2 голосов
/ 09 июня 2009

Я думаю, что вы можете использовать термин «проверить» здесь в его смысле CVS, то есть «обновление svn». Это верно?

Если это так, то вы можете обновить до нужной ревизии:

svn update -r12345

или даже только те файлы этой ревизии:

svn update -r12345 file1 file2 file3

хотя вы должны получить список файлов из SVN, используя некоторые другие предложения.

2 голосов
/ 09 июня 2009

Я знаю, что это немного оффтоп, но я использую для этого TRAC, и он экспортирует только файлы, измененные между двумя ревизиями, в виде zip-архива с файлами в их исходной структуре каталогов.

1 голос
/ 13 мая 2016

Вот простая версия bash-скрипта. Я использовал «шаблон поиска», чтобы удалить ненужные строки. Редакция, адрес хранилища и путь назначения указываются в качестве аргументов, но могут быть жестко закодированы.

#!/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
1 голос
/ 17 октября 2014

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

Создайте 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 в каждом каталоге, не знаете, как это будет работать) 1018 *

rm -rf ./*

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

cp /path/to/wherever/r219-232_Summary.txt ./r219-232_Summary.sh
chmod 777 ./r219-232_Summary.sh
./r219-232_Summary.sh

Если все идет по плану, то shell должен проанализировать каждую команду 'svn up' в вашем текстовом файле и заполнить каталог только теми файлами, которые вам интересны.

1 голос
/ 07 февраля 2012

Вот один из способов сделать это.

svn co - глубина пустого 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 (по крайней мере, в v.1.7.1 +), но, похоже, оно не выполняет то, что я хотел.

1 голос
/ 09 июня 2009

Если вы используете последнюю версию svn, вы можете извлечь пустую папку, а затем обновить определенные файлы.

после получения списка файлов для выбора,

svn co --depth=empty url dest
cd dest
svn up file1 file2 file3

Редактировать: почти то же решение, что и принятый ответ: Оформить заказ на один файл из Subversion

1 голос
/ 09 июня 2009

Вы можете проверить список затронутых файлов, используя svn log -q -v -r123 url.

Если вы действительно хотите получить только затронутые файлы, вы можете использовать svn cat urlToFile -r123 > myfile для каждого файла.

1 голос
/ 09 июня 2009

svn checkout работает только на уровне каталогов, а не на уровне файлов. Конечно, если все изменения в конкретном наборе изменений были из одного каталога, вы можете выполнить svn checkout <url> <path> -r<revid>.

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