проверка истории удаленного файла
-
03-07-2019 - |
Вопрос
Если я удалю файл в Subversion, как я могу просмотреть его историю и содержимое?Если я попытаюсь сделать svn cat
или svn log
для несуществующего файла он жалуется, что файл не существует.
Кроме того, если бы я хотел воскресить файл, должен ли я просто svn add
вернуть его?
(Я спрашивал конкретно о Subversion, но я также хотел бы услышать о том, как Bazaar, Mercurial и Git справляются и с этим случаем.)
Решение
Чтобы получить журнал удаленных файлов, используйте
svn log -r lastrevisionthefileexisted
Если вы хотите восстановить файл и сохранить историю его версий, используйте
svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file
Если вам просто нужно содержимое файла, но без версии (например, для быстрой проверки), используйте
svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file
Ни в коем случае НЕ используйте "svn up" для возврата удаленного файла!
Другие советы
Когда вы хотите просмотреть старые файлы, вы действительно должны знать разницу между:
svn cat http://server/svn/project/file -r 1234
и
svn cat http://server/svn/project/file@1234
Первая версия рассматривает путь, который является сейчас доступно в виде http://server/svn/project/file и извлекает этот файл в том виде, в каком он был в редакции 1234.(Таким образом, этот синтаксис делает нет работать после удаления файла).
Второй синтаксис возвращает файл, который был доступен как http://server/svn/project/file в редакции 1234.Итак , этот синтаксис ДЕЛАЕТ работайте с удаленными файлами.
Вы даже можете объединить эти методы для извлечения файла, который был доступен в редакции 2345 как http://server/svn/project/file но с таким содержанием, как это было в 1234 году , с:
svn cat http://server/svn/project/file@2345 -r 1234
Сначала найдите номер редакции, из-за которой файл был удален:
svn log -v > log.txt
Затем поищите в log.txt (не гуру SVN, поэтому я не знаю лучшего способа) строку с
D <deleted file>
и посмотрите, что это была за редакция.Затем, как и в других ответах, восстановите файл, используя предыдущую редакцию.
В git нет ничего особенного.Если вы знаете имя файла, вы можете узнать об изменении, которое привело к его удалению, с помощью log:
git log -n 1 -- filename
Затем вы можете использовать этот коммит, чтобы получить файл в том виде, в каком он существовал до удаления.
git checkout [last_revision]^ filename
Пример:
dhcp-120:/tmp/slosh 587% ls -l slosh.tac
ls: slosh.tac: No such file or directory
dhcp-120:/tmp/slosh 588% git log -n 1 -- slosh.tac
commit 8d4a1f1a94e4aa37c1cb9d329a140d08eec1b587
Author: Dustin Sallings <dustin@spy.net>
Date: Mon Dec 15 11:25:00 2008 -0800
Get rid of a .conf and replace it with .tac.
dhcp-120:/tmp/slosh 589% git checkout 8d4a1f^ slosh.tac
dhcp-120:/tmp/slosh 590% ll slosh.tac
-rw------- 1 dustin wheel 822 Dec 30 12:52 slosh.tac
Обратите внимание, что на самом деле это не возвращает файл обратно в систему управления версиями.Он просто удаляет файл в том виде, в каком он существовал в своем конечном состоянии, в текущее местоположение.Затем вы можете добавить его или просто проверить, или что угодно еще с этого момента.
Решение, использующее только графический интерфейс:
Если вы знаете имя файла, но не знаю его последнего номера редакции или даже его путь:
- Из браузера репозитория выполните "Показать журнал" в корневом каталоге
- Нажмите "Показать все" (в нижней части диалогового окна журнала).
- Введите имя файла в текстовое поле Фильтра (в верхней части диалогового окна журнала).
Затем будут показаны только те ревизии, в которых файл был добавлен / изменен / удален. Это ваша история файла.
Обратите внимание, что если файл был удален путем удаления одной из его родительских папок, в журнале не будет записи "удалено" (и поэтому решение mjy не будет работать).В этом случае его самая последняя запись в отфильтрованном журнале будет соответствовать его содержимому при удалении.
svn log -v | grep -B50 YourDeletedFileName
Я укажу вам путь и ревизию.В git (также проверяет наличие переименований):
git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
В дополнение к ответу Дастина, если вы просто хотите изучить содержимое, а не проверять его, в его примере вы можете сделать:
$ git show 8d4a1f^:slosh.tac
тот самый :разделяет ревизию и путь в этой ревизии, фактически запрашивая конкретный путь в конкретной ревизии.
Используйте эту команду:
svn log -v | awk '/^r[0-9]+/ { rev = $1; }; / D .*filename_escaped_for_regex/ { print rev" "$2; };'
Здесь будут перечислены все ревизии, которые когда-либо удаляли файлы, соответствующие шаблону.То есть, если вы ищете файл README, то все /src/README
, /src/README.first
, и /some/deeply/hidden/directory/READMENOT
будут найдены и занесены в список.
Если ваш имя файла содержит косую черту (путь), точки или другие специальные символы регулярных выражений, не забудьте экранировать их, чтобы избежать несоответствия или ошибок.
Если вы не знаете путь к удаленному файлу, оказывается, вы можете Поиск для этого в остальном все слишком тяжело svn log
команда:
svn log --search <deleted_file_or_pattern> -v
Команда, вероятно, загружает сервер так же сильно, как и без опции поиска, но, по крайней мере, остальные задействованные ресурсы (включая ваши глазные яблоки) будут в некотором роде освобождены, поскольку это сообщит вам, в какой редакции был удален этот файл.Затем вы можете следовать другим советам (в основном используя тот же svn log
команда, но уже по определенному пути).
На самом деле плакат задал здесь 3 вопроса:
- Как мне просмотреть историю удаленного файла в Subversion?
- Как мне просмотреть содержимое удаленного файла в Subversion?
- Как мне восстановить удаленный файл в Subversion?
Все ответы, которые я вижу здесь, относятся к вопросам 2 и 3.
Ответ на вопрос 1 таков:
svn log http://server/svn/project/file@1234
Вам все еще нужно получить номер редакции, когда файл существовал в последний раз, на что другие здесь четко ответили.
Ах, поскольку я учусь пользоваться Bazaar, это то, что я попробовал.Без успеха, похоже, вы не сможете регистрируйте и комментируйте удаленные файлы в настоящее время...:-(
Пытался:
> bzr log -r 3 Stuff/ErrorParser.hta
bzr: ERROR: Path does not have any revision history: Stuff/ErrorParser.hta
но любопытно (и к счастью), что Я могу это сделать:
> bzr cat -r 3 Stuff/ErrorParser.hta
и:
> bzr diff -r 2..3 Stuff/ErrorParser.hta
и, как было предложено в приведенной выше ошибке:
> bzr log -v | grep -B 1 ErrorParser
(скорректировать -B
(--before-context
) параметр по мере необходимости).
Вам нужно будет указать редакцию.
svn log -r <revision> <deleted file>
Если вы хотите просмотреть историю файла до его переименования, то, как указано в комментарий здесь вы можете использовать
git log --follow -- current_file_name
Я сам хотел получить ответ.Попробуйте выполнить следующее, чтобы вывести только удаления из svn log
.
svn log --stop-on-copy --verbose [--limit <limit>] <repo Url> | \
awk '{ if ($0 ~ /^r[0-9]+/) rev = $0 }
{ if ($0 ~ /^ D /) { if (rev != "") { print rev; rev = "" }; print $0 } }'
Это фильтрует выходные данные журнала с помощью awk ( авк ). awk ( авк ) буферизует каждую найденную строку ревизии, выводя ее только при обнаружении записи удаления.Каждая редакция выводится только один раз, поэтому несколько удалений в редакции группируются вместе (как в стандартной svn log
выходной сигнал).
Вы можете указать --limit
чтобы уменьшить количество возвращаемых записей.Вы также можете удалить --stop-on-copy
, по мере необходимости.
Я знаю, что есть жалобы на эффективность синтаксического анализа всего журнала.Я думаю, что это лучшее решение, чем grep и его "раскинуть широкую сеть". -B
вариант.Я не знаю, является ли это более эффективным, но я не могу придумать альтернативы svn log
.Это похоже на ответ @Alexander Amelkin, но не требует конкретного имени.А еще это мой первый awk ( авк ) сценарий, так что это может быть нетрадиционно.
Я написал php-скрипт, который копирует журнал svn всех моих репозиториев в базу данных mysql.Теперь я могу выполнять полнотекстовый поиск по своим комментариям или названиям файлов.
Вы можете найти последнюю редакцию, которая предоставляет файл, используя двоичный поиск.Я создал простой /bin/bash
скрипт для этого:
function svnFindLast(){
# The URL of the file to be found
local URL="$1"
# The SVN revision number which the file appears in (any rev where the file DOES exist)
local r="$2"
local R
for i in $(seq 1 "${#URL}")
do
echo "checkingURL:'${URL:0:$i}'" >&2
R="$(svn info --show-item revision "${URL:0:$i}" 2>/dev/null)"
echo "R=$R" >&2
[ -z "$R" ] || break
done
[ "$R" ] || {
echo "It seems '$URL' is not in a valid SVN repository!" >&2
return -1
}
while [ "$r" -ne "$R" -a "$(($r + 1))" -ne "$R" ]
do
T="$(($(($R + $r)) / 2))"
if svn log "${URL}@${T}" >/dev/null 2>&1
then
r="$T"
echo "r=$r" >&2
else
R="$T"
echo "R=$R" >&2
fi
done
echo "$r"
}
Предположим, ваш файл был назван как ~/src/a/b /c/deleted.file
cd ~/src/a/b/c # to the directory where you do the svn rm or svn mv command
#cd ~/src # if you forget the correct directory, just to the root of repository
svn log -v | grep -w -B 9 deleted.file | head # head show first 10 lines
пример выходных данных, нашел его по адресу r90440
...
r90440 | user | 2017-02-03 11:55:09 +0800 (Fri, 03 Feb 2017) | 4 lines
Changed paths:
M /src/a/b/c/foo
M /src/a/b/c/bar
D /src/a/b/c/deleted.file
скопируйте его обратно в предыдущую версию (90439= 90440-1).
svn cp URL_of_deleted.file@90439 .