Если я удаляю файл в Subversion, как я могу посмотреть его историю и содержимое? Если я попытаюсь сделатьsvn cat
или svn log
на несуществующий файл, он жалуется, что файл не существует.
Кроме того, если я хочу воскресить файл, я должен просто svn add
вернуть его?
(Я спрашивал конкретно о Subversion, но я также хотел бы услышать о том, как Bazaar, Mercurial и Git также занимаются этим делом.)
svn
version-control
bazaar
Бенджамин Петерсон
источник
источник
Когда вы хотите посмотреть на старые файлы, вы действительно должны знать разницу между:
и
Первая версия просматривает путь, который теперь доступен как http: // server / svn / project / file, и получает этот файл, как это было в ревизии 1234. (Таким образом, этот синтаксис не работает после удаления файла).
Второй синтаксис получает файл , который был доступен в качестве HTTP: // сервера / SVN / проект / файл в пересмотре 1234. Так что этот синтаксис ДЕЛАЕТ работу на удаленные файлы.
Вы можете даже объединить эти методы для получения файла, который был доступен в ревизии 2345, как http: // server / svn / project / file, но с содержимым, как это было в 1234, с:
источник
./local/file
когда./local
каталог не существовал. Это не может быть проблемой для более новых версий SVN.^
нотация оказывается полезной: можно сказать, что это относится к корню хранилищаsvn cat ^/local/file@REV
(в зависимости от расстояния между корнем хранилища и URL).svn: E200009: Could not cat all targets because some targets are directories
Сначала найдите номер ревизии, в которой был удален файл:
Затем найдите в файле log.txt (не гуру SVN, так что я не знаю лучшего способа) строку с
и посмотрите, какая ревизия была. Затем, как и в других ответах, воскресите файл, используя предыдущую версию.
источник
В Git нет ничего особенного. Если вы знаете имя файла, вы можете узнать об изменениях, которые удалили его с помощью журнала:
Затем вы можете использовать этот коммит, чтобы получить файл, существовавший до удаления.
Пример:
Обратите внимание, что это фактически не возвращает файл обратно в контроль версий. Он просто сбрасывает файл в том виде, в котором он существовал в своем конечном состоянии, в текущее местоположение. Затем вы можете добавить его или просто осмотреть его или что-то еще с этой точки.
источник
Решение с использованием только графического интерфейса:
Если вы знаете имя файла, но не знаете его номер последней редакции или даже путь к нему:
Это тогда покажет только те ревизии, где файл был добавлен / изменен / удален. Это ваша история файла.
Обратите внимание, что если файл был удален путем удаления одной из его родительских папок, у него не будет «удаленной» записи в журнале (и поэтому решение mjy не будет работать). В этом случае его последняя запись в отфильтрованном журнале будет соответствовать его содержимому при удалении.
источник
Получит вам путь и ревизию. В git (также проверяет переименования):
источник
В дополнение к ответу Дастина, если вы просто хотите изучить содержимое, а не проверить его, в его примере вы можете сделать:
: разделяет ревизию и путь в этой ревизии, фактически запрашивая конкретный путь в конкретной ревизии.
источник
Используйте эту команду:
Это перечислит все ревизии, которые когда-либо удаляли любые файлы, соответствующие шаблону. То есть, если вы ищете файл README, то все
/src/README
,/src/README.first
и/some/deeply/hidden/directory/READMENOT
будут найдены и перечислены.Если ваше имя файла содержит косые черты (путь), точки или другие специальные символы регулярных выражений, не забывайте избегать их, чтобы избежать несоответствия или ошибок.
источник
Если вы не знаете путь к удаленному файлу, оказывается, что вы можете искать его с помощью команды, которая в противном случае будет слишком тяжелой
svn log
:Команда, вероятно, забивает сервер так же сильно, как и без опции поиска, но, по крайней мере, остальные задействованные ресурсы (включая ваши глазные яблоки) будут немного облегчены, поскольку это скажет вам, в какой ревизии этот файл был удален. Затем вы можете следовать другим советам (в основном используя ту же
svn log
команду, но уже по заданному пути).источник
svn log --search _test2.php -v
... svn: неверный параметр: --search ... :(Постер фактически задал 3 вопроса здесь:
Все ответы, которые я вижу здесь, на вопросы 2 и 3.
Ответ на вопрос 1:
Вам все еще нужно получить номер ревизии для того времени, когда файл существовал в последний раз, на который здесь явно отвечают другие.
источник
Ах, поскольку я учусь пользоваться Базаром, я попробовал это. Без успеха, кажется, вы не можете войти и аннотировать удаленные файлы настоящее время ... :-(
Пытался:
но с любопытством (и к счастью) я могу сделать:
и:
и как предложено в ошибке выше:
(отрегулируйте
-B
(--before-context
) параметр по мере необходимости).источник
Вам нужно будет указать ревизию.
источник
Если вы хотите просмотреть историю файла до того, как он будет переименован, то, как указано в комментарии, вы можете использовать
источник
Я сам хотел получить ответ. Попробуйте следующее для вывода только удаляет из
svn log
.Это фильтрует вывод журнала через awk . awk буферизует каждую найденную строку ревизии, выводя ее только тогда, когда найдена удаляемая запись. Каждая ревизия выводится только один раз, поэтому несколько удалений в ревизии группируются (как в стандартном варианте).
svn log
выводе).Вы можете указать,
--limit
чтобы уменьшить количество возвращаемых записей. Вы также можете удалить--stop-on-copy
, по мере необходимости.Я знаю, что есть жалобы на эффективность разбора всего журнала. Я думаю, что это лучшее решение, чем grep и его
-B
опция «бросить широкую сеть» . Я не знаю, является ли это более эффективным, но я не могу придумать альтернативуsvn log
. Это похоже на ответ @Alexander Amelkin, но не требует конкретного имени. Это также мой первый скрипт на awk , поэтому он может быть нетрадиционным.источник
Предположим, что ваш файл был назван как ~ / src / a / b / c / dele.file
образец вывода, нашел его на r90440
скопируйте его обратно в предыдущую версию (90439 = 90440-1)
источник
Вы можете найти последнюю ревизию, которая предоставляет файл, используя бинарный поиск. Я создал простой
/bin/bash
скрипт для этого:источник
Я написал php-скрипт, который копирует журнал svn всех моих репозиториев в базу данных mysql. Теперь я могу выполнять полнотекстовый поиск по моим комментариям или именам файлов.
источник