просмотр истории удаленного файла - PullRequest
153 голосов
/ 30 декабря 2008

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

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

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

Ответы [ 17 ]

144 голосов
/ 14 февраля 2009

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

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. Таким образом, этот синтаксис DOES работает с удаленными файлами.

Вы даже можете комбинировать эти методы для извлечения файла, который был доступен в ревизии 2345, как http://server/svn/project/file, но с содержимым, как это было в 1234 с:

svn cat http://server/svn/project/file@2345 -r 1234
90 голосов
/ 30 декабря 2008

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

svn log -v > log.txt

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

D <deleted file>

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

77 голосов
/ 30 декабря 2008

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

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', чтобы вернуть удаленный файл!

27 голосов
/ 30 декабря 2008

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

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

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

14 голосов
/ 29 ноября 2010

Решение, использующее только графический интерфейс:

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

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

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

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

13 голосов
/ 06 сентября 2012
svn log -v | grep -B50 YourDeletedFileName

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

git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
8 голосов
/ 23 марта 2012

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

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 голосов
/ 31 декабря 2008

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

$ git show 8d4a1f^:slosh.tac

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

5 голосов
/ 26 ноября 2014

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

svn log --search <deleted_file_or_pattern> -v

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

4 голосов
/ 07 ноября 2011

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

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

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

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

svn log http://server/svn/project/file@1234

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

...