it-swarm.com.ru

просмотр истории удаленного файла

Если я удаляю файл в Subversion, как я могу посмотреть его историю и содержимое? Если я пытаюсь сделать svn cat или svn log для несуществующего файла, он жалуется, что файл не существует.

Кроме того, если я хочу воскресить файл, я должен просто svn add его вернуть?

(Я спрашивал конкретно о Subversion, но я также хотел бы услышать о том, как Bazaar, Mercurial и Git также занимаются этим делом.)

154
Benjamin Peterson

Чтобы получить журнал удаленного файла, используйте

svn log -r lastrevisionthefileexisted

Если вы хотите воскресить файл и сохранить его историю версий, используйте

svn copy url/of/[email protected] -r lastrevisionthefileexisted path/to/workingcopy/file

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

svn cat url/of/[email protected] -r latrevisionthefileexisted > file

В любом случае, НЕ используйте 'svn up', чтобы вернуть удаленный файл!

79
Stefan

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

svn cat http://server/svn/project/file -r 1234

а также

svn cat http://server/svn/project/[email protected]

Первая версия просматривает путь, который теперь доступен как 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/[email protected] -r 1234
145
Bert Huijben

Сначала найдите номер ревизии, в которой был удален файл:

svn log -v > log.txt

Затем найдите в файле log.txt (не гуру SVN, так что я не знаю лучшего способа) строку с

D <deleted file>

и посмотрите, какая ревизия была. Затем, как и в других ответах, воскресите файл, используя предыдущую версию.

91
mjy

В Git нет ничего особенного. Если вы знаете имя файла, вы можете узнать об изменениях, которые удалили его с помощью журнала:

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 <[email protected]>
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

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

27
Dustin

Решение с использованием только графического интерфейса:

Если вы знаете имя файла, но не знаете его номер последней редакции или даже его путь:

  1. Из Repo Browser сделать "Показать журнал" в корне
  2. Нажмите "Показать все" (внизу диалогового окна журнала)
  3. Введите имя файла в текстовое поле "Фильтр" (вверху диалога журнала)

Это тогда покажет только те ревизии, где файл был добавлен/изменен/удален. Это ваша история файла.

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

14
Mark Foreman
svn log -v | grep -B50 YourDeletedFileName

Получит вам путь и ревизию. В git (также проверяет переименования):

git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
13
Jonas Byström

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

$ git show 8d4a1f^:slosh.tac

: разделяет ревизию и путь в этой ревизии, фактически запрашивая конкретный путь в конкретной ревизии.

8
Pieter

Используйте эту команду:

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 будут найдены и перечислены.

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

8
Alexander Amelkin

Если вы не знаете путь к удаленному файлу, оказывается, что вы можете выполнить поиск его в противном случае слишком сложная команда svn log:

svn log --search <deleted_file_or_pattern> -v

Команда, вероятно, забивает сервер так же сильно, как и без опции поиска, но, по крайней мере, остальные задействованные ресурсы (включая ваши глазные яблоки) будут немного облегчены, так как это скажет вам, в какой ревизии этот файл был удален. Затем вы можете следовать другим советам (в основном используя ту же команду svn log, но уже по определенному пути).

5
JMB

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

Пытался:

> 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)).

4
PhiLho

Постер фактически задал 3 вопроса здесь:

  1. Как посмотреть историю удаленных файлов в Subversion?
  2. Как посмотреть содержимое удаленного файла в Subversion?
  3. Как воскресить удаленный файл в Subversion?

Все ответы, которые я вижу здесь, на вопросы 2 и 3.

Ответ на вопрос 1:

svn log http://server/svn/project/[email protected]

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

4
dekeguard

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

1
N13

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

git log --follow -- current_file_name
1
Andrew Grimm

Вам нужно будет указать ревизию.

svn log -r <revision> <deleted file>
1
Jack M.

Вы можете найти последнюю ревизию, которая предоставляет файл, используя бинарный поиск. Для этого я создал простой скрипт /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"
}
0
Sebo.PL

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

0
thinsoldier

Предположим, что ваш файл был назван ~/src/a/b/c/Удаленный. Файл

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 [email protected] .
0
Daniel YC Lin