开发者

SVN: How to know in which revision a file was deleted?

Given that I'm using svn command line on Windows, how to find the revision number, in which a file was deleted? On Windows, there are no fancy stuff like grep and I attempting to use command line only, without TortoiseSVN. Thanks in adva开发者_高级运维nce!

EDIT:

  • I saw a few posts, like examining history of deleted file but it did not answer my question.
  • Is there any way other than svn log -v url > log.out and search with Notepad?


Install Cygwin.

I use this:

svn log -v --limit <nr> -v | grep -E '<fileName>|^r' | grep -B 1 <fileName>

where

fileName - the name of the file or any pattern which matches it
nr - the number of latest revisions in which I want to look for

This will give you the revisions for all the actions (add, delete, remove, modify) concerning the file, but with a simple tweak with grep you can get the revisions only for deletion.

(Obviously, --limit is optional, however you usually have an overview about how deep you need to search which gains you some performance.)


The log is the place to look. I know you don't want to hear that answer, but that is where you need to look for deleted files in SVN.

The reason for this is simply that a deleted file is not visible after it's been deleted. The only place to find out about its existence at all is either in the logs, or by fetching out an earlier revision prior to it being deleted.

The easiest way I know of to deal with this problem is to move away from the the command line, and use a GUI tool such as TortoiseSVN.

TortoiseSVN links itself into the standard Windows file Explorer, so it's very easy to use. In the context of answering this question, you would still use it to look at the logs, but it becomes a much quicker excersise:

Browser to the SVN folder you want to examine. Then right-click on the folder icon and select TortoiseSVN -> View Logs from the context menu.

You'll now get a window showing all the revisions made in that folder. In particular, it is easy to see which revisions have had additions and deletions, because the list includes a set of Action icons for each revision. You can double-click on a revision to get a list of files that were changed (or straight into a diff view if only one file was changed)

So you can easily see which revisions have had deletions, and you can quickly click them to find out which files were involved. It really is that easy.

I know you're asking about the command-line, but for administrative tasks like this, a GUI browser really does make sense. It makes it much quicker to see what's happening compared with trying to read through pages of cryptic text (no matter how well versed you are at reading that text).


This question was posted and answered some time ago. In this answer I'll try to show a flexible way to get the informations asked and extend it.

In cygwin, use svn log in combination with awk

REPO_URL=https://<hostname>/path/to/repo
FILENAME=/path/to/file

svn log ${REPO_URL} -v --search "${FILENAME}" | \
    awk -v var="^   [D] ${FILENAME}$" \
    '/^r[0-9]+/{rev=$1}; \
    $0 ~ var {print rev $0}'
  • svn log ${REPO_URL} -v --search "${FILENAME}" asks svn log for a verbose log containing ${FILENAME}. This reduces the data transfer.
  • The result is piped to awk. awk gets ${FILENAME} passed via -v in the var vartogether with search pattern var="^ [D] ${FILENAME}$"
  • In the awk program /^r[0-9]+/ {rev=$1} assigns the revision number to rev if line matches /^r[0-9]+/.
  • For every line matching ^ [D] ${FILENAME}$ awk prints the stored revision number rev and the line: $0 ~ var {print rev $0}

if you're interested not only in the deletion of the file but also creation, modification, replacing, change Din var="^ [D] ${FILENAME}$"to DAMR.

The following will give you all the changes:

svn log ${REPO_URL} -v --search "${FILENAME}" | \
    awk -v var="^   [DAMR] ${FILENAME}$" \
    '/^r[0-9]+/ {rev=$1}; \
    $0 ~ var {print rev $0}'

And if you're interested in username, date and time:

svn log ${REPO_URL} -v --search "${FILENAME}" | \
    awk -v var="^   [DAMR] ${FILENAME}$" \
    '/^r[0-9]+/ {rev=$1;user=$3;date=$5;time=$6}; \
    $0 ~ var {print rev " | " user " | " date " | " time " | " $0}'
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜