165

Subversionでファイルを削除した場合、その履歴と内容を確認するにはどうすればよいですか?svn cat存在しないファイルを実行しようとするsvn logと、ファイルが存在しないというメッセージが表示されます。

また、ファイルを復活させたい場合は、svn add元に戻す必要がありますか?

(Subversionについて具体的に質問しましたが、Bazaar、Mercurial、Gitがこのケースをどのように処理するかも聞きたいです。)

4

17 に答える 17

153

古いファイルを見たいときは、次の違いを知っておく必要があります。

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

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

最初のバージョンは、現在http://server/svn/project/fileとして利用できるパスを見て、リビジョン 1234 のときと同じようにそのファイルを取得します (したがって、この構文はファイルの削除後は機能しません)。

2 番目の構文は、リビジョン 1234 でhttp://server/svn/project/fileとして利用可能だったファイルを取得します。したがって、この構文は削除されたファイルに対して機能します。

これらのメソッドを組み合わせて、リビジョン 2345 でhttp://server/svn/project/fileとして利用可能だったファイルを取得することもできます が、内容は 1234 と同じです。

svn cat http://server/svn/project/file@2345 -r 1234
于 2009-02-13T21:18:29.193 に答える
97

まず、ファイルが削除されたリビジョン番号を見つけます。

svn log -v > log.txt

次に、log.txt(SVNの第一人者ではないため、より良い方法はわかりません)で次の行を探します

D <deleted file>

そして、それがどのリビジョンであったかを確認します。次に、他の回答と同様に、以前のリビジョンを使用してファイルを復活させます。

于 2008-12-30T20:17:39.030 に答える
87

削除されたファイルのログを取得するには、

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

いずれの場合も、削除されたファイルを取り戻すために「svnup」を使用しないでください。

于 2008-12-30T20:13:24.437 に答える
25

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

これは実際にファイルをリビジョン管理に戻さないことに注意してください。最終的な状態で存在していたファイルを現在の場所にドロップするだけです。その後、それを追加したり、その時点から検査したりできます。

于 2008-12-30T20:56:32.070 に答える
17

GUI のみを使用したソリューション:

ファイルの名前はわかっているが、最後のリビジョン番号やパスがわからない場合:

  1. Repo Browser から、ルートで「ログを表示」を実行します。
  2. [すべて表示] をクリックします (ログ ダイアログの下部にあります)。
  3. ファイル名を [フィルター] テキストボックス (ログ ダイアログの上部) に入力します。

これにより、ファイルが追加/変更/削除されたリビジョンのみが表示されます。これはファイルの履歴です。

親フォルダーの 1 つを削除することによってファイルが削除された場合、ログには「削除済み」のエントリが含まれないことに注意してください (したがって、mjy のソリューションは機能しません)。この場合、フィルタリングされたログの最新のエントリは、削除時の内容に対応します。

于 2010-11-29T05:08:42.017 に答える
13
svn log -v | grep -B50 YourDeletedFileName

パスとリビジョンを取得します。git で (名前の変更もチェックします):

git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
于 2012-09-06T07:27:22.983 に答える
9

削除されたファイルへのパスがわからない場合は、それ以外の場合は非常に重いコマンドで検索できることがわかります。svn log

svn log --search <deleted_file_or_pattern> -v

このコマンドはおそらく、検索オプションを使用しない場合と同じようにサーバーに負荷をかけますが、少なくとも関連する残りのリソース (あなたの眼球を含む) は、そのファイルが削除されたリビジョンがわかるので、少し安心できます。次に、他のヒントに従うことができます (主に同じsvn logコマンドを使用しますが、既に定義されたパス上にあります)。

于 2014-11-26T12:26:19.233 に答える
9

次のコマンドを使用します。

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が検出され、一覧表示されます。

ファイル名にスラッシュ (パス)、ドット、またはその他の特殊な正規表現文字が含まれている場合は、それらをエスケープして、不一致やエラーを回避することを忘れないでください。

于 2012-03-23T10:19:35.250 に答える
8

ダスティンの答えに加えて、内容を調べてチェックアウトしたくない場合は、彼の例では次のことができます。

$ git show 8d4a1f^:slosh.tac

: はリビジョンとそのリビジョン内のパスを分離し、特定のリビジョンで特定のパスを効果的に要求します。

于 2008-12-30T22:22:22.320 に答える
5

ポスターは実際にここで3つの質問をしました:

  1. Subversion で削除されたファイルの履歴を確認するにはどうすればよいですか?
  2. Subversion で削除されたファイルの内容を確認するにはどうすればよいですか?
  3. Subversion で削除されたファイルを復活させるにはどうすればよいですか?

ここに表示されるすべての回答は、質問 2 と 3 に対するものです。

質問 1 の答えは次のとおりです。

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

ファイルが最後に存在したときのリビジョン番号を取得する必要がありますが、これについては他の人がここで明確に答えています。

于 2011-11-07T16:08:09.423 に答える
4

ああ、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) パラメータを調整します)。

于 2009-02-12T16:55:07.620 に答える
1

リビジョンを指定する必要があります。

svn log -r <revision> <deleted file>
于 2008-12-30T20:09:15.943 に答える
1

名前が変更される前にファイルの履歴を確認したい場合は、ここのコメントで述べたように使用できます

git log --follow -- current_file_name
于 2010-12-01T05:07:00.683 に答える
1

私自身、答えが欲しかった。からの削除のみを出力するには、次のことを試してください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は、見つかった各リビジョン行をバッファリングし、削除レコードが見つかった場合にのみ出力します。各リビジョンは 1 回だけ出力されるため、リビジョン内の複数の削除は (標準svn log出力のように) グループ化されます。

を指定し--limitて、返されるレコードの量を減らすことができます。必要に応じて を削除することもでき--stop-on-copyます。

ログ全体を解析する効率について不満があることは承知しています。-Bこれは、grep とその「広いネットをキャストする」オプションよりも優れたソリューションだと思います。より効率的かどうかはわかりませんが、に代わるものは思いつきませんsvn log。@Alexander Amelkin の回答に似ていますが、特定の名前は必要ありません。初めてのawkスクリプトでもあるので、型にはまらないかもしれません。

于 2013-01-08T16:42:25.600 に答える
-1

すべてのリポジトリの svn ログを mysql データベースにコピーする php スクリプトを作成しました。コメントやファイル名で全文検索できるようになりました。

于 2015-03-26T17:21:40.020 に答える