Как мне найти файл, который когда-либо существовал в SVN-репо? - PullRequest
6 голосов
/ 05 марта 2012

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

Я нашел только окольный способ получения журнала для содержащего каталога, а затем проанализировал его для удаленных записей:

svn log -v a/b/|grep "   D .*a/b/c.xml"

Работает, но чувствует себя "нечистым" и несколько хрупким.

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Исходя из вашего вопроса, вы неявно квалифицируете свой запрос к удаленным файлам (потому что, предположительно, если он не будет удален, простой поиск в каталоге откроет его).Комментарий Ленивого Барсука заслуживает внимания: снятие квалификации без потери точности и, тем самым, упрощение команды.Я все за упрощение, но, учитывая любые проблемы, я также хотел бы рассмотреть возможность получить больше от решения при небольших дополнительных затратах.

Итак, начнем с предложенного вами решения:

svn log -v a/b/ | grep "   D .*a/b/c.xml"

Iсначала добавлю опцию -q, которая сокращает вывод, который вы все равно просто отбрасываете:

svn log -v -q a/b/ | grep "   D .*a/b/c.xml"

А потом я бы хотел знать не просто , был ли такойфайл удален, но также , когда он был удален (т.е. в какой ревизии).Поскольку вы также неявно квалифицировали свою среду для Unix / Linux, вот решение с помощью awk (адаптировано из этой записи в блоге ):

svn log -q -v a/b/ | awk '
    /^r[0-9]* \|/ { REVISION=$1; }
    /  D/ { print REVISION": "$0; }
' | grep "   D .*a/b/c.xml"

Это работает из-за формата svn log выводится при использовании параметра –v: он сообщает ревизию, после которой следуют все файлы в этой ревизии.Вот пример, показывающий, что файл Page.cs был удален в ревизии 10506:

r10506 | msorens | 2011-02-14 12:58:56 -0800 (Mon, 14 Feb 2011) | 1 line
Changed paths:
   A /Projects/Test/Common
   A /Projects/Test/Common/Setup.cs
   A /Projects/Test/Common/Utility.cs
   D /Projects/Test/Page.cs

Приведенные выше команды awk анализируют вывод в этом формате, извлекая номер ревизии из верхней строки, затем любые файлы, помеченные как удаленные («D» линии).Для Windows PowerShell обеспечивает ту же мощность и простоту использования, что и awk, с помощью оператора switch:

$( switch -Regex (svn log -q -v a/b) {
    '^(r[0-9]*) \|' { $rev = $Matches[1] }
    '^   D\s+(.*)'  { "{0,-6} {1}" -f $rev, $Matches[1] }
} ) | Select-String "a/b/c.xml"

Но с TortoiseSVN есть более простой способ - просто откройте окно журнала в корнесвою рабочую копию и введите имя файла в поле поиска.Список ревизий сразу фильтруется по тому, что вы вводите.Если выводится более одной строки, последняя (самая верхняя) ревизия всегда будет той, где файл был удален.

0 голосов
/ 05 мая 2015

Благодаря ответу @Michael Sorens я получил это

В моем случае мне нужно было посмотреть, какие файлы были удалены из папки . / Assets / gfx

Вот код оболочки bash в однострочнике, когда у вас есть настройка ввода, где каждая строка - это командная строка, а 'mysearchstr' - это переменная, установленная в оболочке

mysearchstr=assets/gfx/
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; } /  D/ { print REVISION": "$0; }' | grep menu

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

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