web-dev-qa-db-ja.com

削除されたファイルの履歴を調べる

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

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

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

155

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

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」を使用しないでください!

79
Stefan

古いファイルを確認したい場合は、次の違いを知っておく必要があります。

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

そして

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

最初のバージョンは、nowであるパスを見て、 http:// server/svn/project/file リビジョン1234にあったファイルを取得します(したがって、この構文はnotがファイル削除後に機能します)。

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

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

svn cat http://server/svn/project/file@2345 -r 1234
146
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

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

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

  1. リポジトリブラウザからルートで「ログを表示」を実行します
  2. 「すべて表示」(ログダイアログの下部にあります)を押します
  3. (ログダイアログの上部にある)フィルタテキストボックスにファイル名を入力します

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

親フォルダーの1つを削除してファイルを削除した場合、ログには「削除済み」エントリーが含まれないことに注意してください(したがって、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

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

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のすべてが検索され、リストされます。

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

8

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

svn log --search <deleted_file_or_pattern> -v

このコマンドは、おそらく検索オプションなしでサーバーを攻撃しますが、少なくとも関連するリソース(眼球を含む)の残りの部分は、ファイルが削除されたリビジョンを知ることができるので、多少は軽減されます。その後、他のヒントに従うことができます(主に同じsvn logコマンドを使用しますが、定義済みのパスに既にあります)。

5
JMB

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

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

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

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

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

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

5
dekeguard

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

4
PhiLho

自分で答えが欲しかった。 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を削除することもできます。

ログ全体の解析の効率性について苦情があることは知っています。これは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

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

0
thinsoldier

ファイルの名前が〜/ src/a/b/c/deleted.fileであると仮定します

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 URL_of_deleted.file@90439 .
0
Daniel YC Lin