Subversionでファイルを削除した場合、その履歴と内容を確認するにはどうすればよいですか?実行しようとしsvn cat
たりsvn log
、存在しないファイルに対して実行しようとすると、ファイルが存在しないというメッセージが表示されます。
また、ファイルを復活させたい場合は、svn add
元に戻す必要がありますか?
(特にSubversionについて質問しましたが、Bazaar、Mercurial、およびGitがこのケースをどのように処理するかについても聞きたいです。)
Subversionでファイルを削除した場合、その履歴と内容を確認するにはどうすればよいですか?実行しようとしsvn cat
たりsvn log
、存在しないファイルに対して実行しようとすると、ファイルが存在しないというメッセージが表示されます。
また、ファイルを復活させたい場合は、svn add
元に戻す必要がありますか?
(特にSubversionについて質問しましたが、Bazaar、Mercurial、およびGitがこのケースをどのように処理するかについても聞きたいです。)
回答:
削除されたファイルのログを取得するには、次を使用します
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」を使用しないでください!
古いファイルを調べたいときは、次の違いを知っておく必要があります。
svn cat http://server/svn/project/file -r 1234
そして
svn cat http://server/svn/project/file@1234
最初のバージョンは、現在http:// server / svn / project / fileとして利用できるパスを調べます、リビジョン1234の場合と同じようにそのファイルを取得します(したがって、この構文はファイル削除後に機能しません)。
2番目の構文は、http:// server / svn / project / fileとして利用可能だったファイルを取得しますリビジョンこの構文はそう1234でDOES削除されたファイルで作業を。
これらのメソッドを組み合わせて、リビジョン2345でhttp:// server / svn / project / fileとして利用できた が、1234と同じ内容のファイルを取得することもできます。
svn cat http://server/svn/project/file@2345 -r 1234
./local/file
ときにローカルのsvnクライアントが解決できないときにエラーが発生した./local
ためです。これは、SVNの新しいバージョンでは問題にならない場合があります。
^
表記は便利になります。これはリポジトリルートを参照するので、言うことができますsvn cat ^/local/file@REV
(リポジトリルートとURLの間の距離によって異なります)。
svn: E200009: Could not cat all targets because some targets are directories
まず、ファイルが削除されたリビジョン番号を見つけます。
svn log -v > log.txt
次に、log.txtを見て(SVNの第一人者ではないため、より良い方法がわかりません)、次の行を探します。
D <deleted file>
そしてそれがどのリビジョンだったかを見てください。次に、他の回答と同様に、以前のリビジョンを使用してファイルを復活させます。
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
これは実際にはファイルをリビジョン管理に戻すわけではないことに注意してください。ファイルが最終的な状態で存在していたため、ファイルを現在の場所にドロップするだけです。その後、それを追加するか、単にそれを検査するか、その時点から何でもできます。
GUIのみを使用するソリューション:
ファイルの名前はわかっているが、最後のリビジョン番号またはパスさえわからない場合:
これにより、ファイルが追加/変更/削除されたリビジョンのみが表示されます。これはファイルの履歴です。
親フォルダーの1つを削除することによってファイルが削除された場合、ログには「削除済み」エントリーが含まれないことに注意してください(したがって、mjyのソリューションは機能しません)。この場合、フィルタリングされたログの最新のエントリは、削除時のコンテンツに対応します。
svn log -v | grep -B50 YourDeletedFileName
パスとリビジョンを取得します。git(名前の変更もチェックします):
git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
次のコマンドを使用します。
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
発見し、表示されます。
ファイル名にスラッシュ(パス)、ドット、またはその他の特殊な正規表現文字が含まれている場合は、それらをエスケープして、不一致やエラーを回避することを忘れないでください。
削除されたファイルへのパスがわからない場合は、そうでなければall-too-heavy コマンドで検索できることがわかりますsvn log
。
svn log --search <deleted_file_or_pattern> -v
コマンドはおそらく、検索オプションを使用しない場合と同じようにサーバーを叩きますが、少なくとも残りの関連リソース(眼球を含む)は、そのファイルが削除されたリビジョンを通知するので、少し安心します。次に、他のヒントに従います(主に同じsvn log
コマンドを使用しますが、すでに定義済みのパス上にあります)。
svn log --search _test2.php -v
... svn:無効なオプション:
あ、バザールの使い方を学んでいるので、試してみました。成功しないと、現在、削除したファイルをログに記録して注釈を付けることができないようです... :-(
試した:
> 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
)パラメータを調整します)。
リビジョンを指定する必要があります。
svn log -r <revision> <deleted file>
私自身、答えが欲しかった。からの削除のみを出力するには、以下を試してください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スクリプトでもあるので、型破りかもしれません。
ファイルの名前が〜/ 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 .
バイナリ検索を使用して、ファイルを提供する最後のリビジョンを見つけることができます。/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"
}