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

<p>если я удаляю файл в subversion, как я могу посмотреть его историю и содержимое? если я пытаюсь сделать <code>svn cat</code> или <code>svn log</code> для несуществующего файла, он жалуется, что файл не существует.</p><p>кроме того, если я хочу воскресить файл, я должен просто <code>svn add</code> его вернуть?</p><p>(я спрашивал конкретно о subversion, но я также хотел бы услышать о том, как bazaar, mercurial и git также занимаются этим делом.)</p>

<p>чтобы получить журнал удаленного файла, используйте</p><pre><code>svn log -r lastrevisionthefileexisted </code></pre><p>если вы хотите воскресить файл и сохранить его историю версий, используйте</p><pre><code>svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file </code></pre><p>если вы просто хотите получить содержимое файла, но не версионное (например, для быстрой проверки), используйте</p><pre><code>svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file </code></pre><p>в любом случае, не используйте 'svn up', чтобы вернуть удаленный файл!</p>

<p>когда вы хотите посмотреть на старые файлы, вы действительно должны знать разницу между:</p><pre><code>svn cat http://server/svn/project/file -r 1234 </code></pre><p>а также</p><pre><code>svn cat http://server/svn/project/file@1234 </code></pre><p>первая версия просматривает путь, который <strong> теперь </strong> доступен как <a href="http://server/svn/project/file">http: // server/svn/project/file</a> , и получает этот файл, как это было в ревизии 1234. (таким образом, этот синтаксис не работает <strong> </strong> после удаления файла).</p><p>второй синтаксис получает файл, который был доступен как <a href="http://server/svn/project/file">http: // server/svn/project/file</a> в редакции 1234. так что этот синтаксис <strong>делает</strong> работа над удаленными файлами.</p><p>вы можете даже объединить эти методы, чтобы получить файл, который был доступен в ревизии 2345, как <a href="http://server/svn/project/file">http: // server/svn/project/file</a> , но с содержимым, как это было в 1234, с:</p><pre><code>svn cat http://server/svn/project/file@2345 -r 1234 </code></pre>

<p>сначала найдите номер ревизии, в которой был удален файл:</p><pre><code>svn log -v > log.txt </code></pre><p>затем найдите в файле log.txt (не гуру svn, так что я не знаю лучшего способа) строку с</p><pre><code>d <deleted file> </code></pre><p>и посмотрите, какая ревизия была. затем, как и в других ответах, воскресите файл, используя предыдущую версию.</p>

<p>в git нет ничего особенного. если вы знаете имя файла, вы можете узнать об изменениях, которые удалили его с помощью журнала:</p><pre><code>git log -n 1 -- filename </code></pre><p>затем вы можете использовать этот коммит, чтобы получить файл, существовавший до удаления.</p><pre><code>git checkout [last\_revision]^ filename </code></pre><h3>пример:</h3><pre><code>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 </code></pre><p>обратите внимание, что это фактически не возвращает файл обратно в контроль версий. он просто сбрасывает файл в том виде, в котором он существовал в своем конечном состоянии, в текущее местоположение затем вы можете добавить его или просто осмотреть его или что-то еще с этой точки.</p>

<p>решение с использованием только графического интерфейса:</p><p>если вы знаете имя файла, но <strong>не знаете его номер последней редакции</strong> или даже его путь:</p><ol> <li>из repo browser сделать "показать журнал" в корне</li> <li>нажмите "показать все" (внизу диалогового окна журнала)</li> <li>введите имя файла в текстовое поле "фильтр" (вверху диалога журнала)</li> </ol><p>это тогда покажет только те ревизии, где файл был добавлен/изменен/удален. <em> это ваша история файла. </em></p><p>обратите внимание, что если файл был удален путем удаления одной из его родительских папок, у него не будет "удаленной" записи в журнале (и поэтому решение mjy не будет работать). в этом случае его последняя запись в отфильтрованном журнале будет соответствовать его содержимому при удалении.</p>

<pre><code>svn log -v | grep -b50 yourdeletedfilename </code></pre><p>получит вам путь и ревизию. в git (также проверяет переименования):</p><pre><code>git log --diff-filter=dr --name-only | grep -b50 yourdeletedfilename </code></pre>

<p>в дополнение к ответу дастина, если вы просто хотите изучить содержимое, а не проверить его, в его примере вы можете сделать:</p><pre><code>$ 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 будут найдены и перечислены.если ваш <strong>имя файла</strong> содержит косые черты (путь), точки или другие специальные символы регулярных выражений, не забывайте избегать их, чтобы избежать несоответствия или ошибок.

если вы не знаете путь к удаленному файлу, оказывается, что вы можете <strong>выполнить поиск</strong> его в противном случае слишком сложная команда svn log:svn log --search <deleted_file_or_pattern> -v команда, вероятно, забивает сервер так же сильно, как и без опции поиска, но, по крайней мере, остальные задействованные ресурсы (включая ваши глазные яблоки) будут немного облегчены, так как это скажет вам, в какой ревизии этот файл был удален. затем вы можете следовать другим советам (в основном используя ту же команду svn log, но уже по определенному пути).

ах, поскольку я учусь пользоваться базаром, я попробовал это. без успеха кажется, что вы не можете <a href="https://bugs.launchpad.net/bzr/+bug/255687">регистрировать и комментировать удаленные файлы в настоящее время ... :-(пытался:> 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)).

постер фактически задал 3 вопроса здесь: как посмотреть историю удаленных файлов в subversion? как посмотреть содержимое удаленного файла в subversion? как воскресить удаленный файл в subversion? все ответы, которые я вижу здесь, на вопросы 2 и 3.ответ на вопрос 1:svn log http://server/svn/project/file@1234 вам все еще нужно получить номер ревизии для того времени, когда файл существовал в последний раз, на который здесь явно отвечают другие.

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

если вы хотите просмотреть историю файла до того, как он будет переименован, то, как указано в <a href="https://stackoverflow.com/questions/2641146/handling-file-renames-in-git/2641221#2641221">комментарий здесь вы можете использоватьgit log --follow -- current_file_name 

вам нужно будет указать ревизию.svn log -r <revision> <deleted file> 

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

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

<p>предположим, что ваш файл был назван ~/src/a/b/c/удаленный. файл</p><pre><code>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 </code></pre><p>образец вывода, нашел его на r90440</p><pre><code>... 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 </code></pre><p>скопируйте его обратно в предыдущую версию (90439 = 90440-1)</p><pre><code>svn cp url\_of\_deleted.file@90439 . </code></pre>