Subversionのバージョン管理に問題があります。リポジトリから作業用コピーをチェックアウトし、そのすべてのファイルをロックしました。次に、ロックを解除せずに、フォルダをディスクから削除しました。
リポジトリにあるロックを解除するにはどうすればよいですか? WindowsでTortoiseSVNを使用しています。フォルダのロックを再帰的に解除するコマンドはありますか?
はい、分かりました。これが私のために働いたものです。
SVNクリーンアップを行うと、ロックも解除されます。
$ svn cleanup
事前ロックセクション から
$ svn status -u
M 23 bar.c
M O 32 raisin.jpg
* 72 foo.h
Status against revision: 105
$ svn unlock raisin.jpg
svn: 'raisin.jpg' is not locked in this working copy
これは単に、現在の作業ディレクトリでファイルがロックされていないことを意味しますが、リポジトリレベルでまだロックされている場合は、強制的にロックを解除できます(「ロックを解除する」)
$ svn unlock http://svn.example.com/repos/project/raisin.jpg
svn: Unlock request failed: 403 Forbidden (http://svn.example.com)
$ svn unlock --force http://svn.example.com/repos/project/raisin.jpg
'raisin.jpg' unlocked.
(これはTortoiseSVN GUIを使用して行ったことです)
他の誰かがファイルをリモートでロックしている場合、TortoiseSVN 1.7.11を使用して次の操作を行うと、作業コピーでファイルが正常にロック解除されることがわかりました。 (vikkunの答えに似ています)
作業コピー内のファイルはロック解除されるはずです。
Svnマシンへの管理者アクセス権があり、「svnadmin」ツールを使用できる場合を除き、最適なオプションは次のように思われます。
svn checkout --ignore-externals *your_repo*
を使用して問題のあるディレクトリをチェックアウトしますsvn status --show-updates
を使用して、ロックされている可能性のあるファイルを見つけます(誰かがステータスコードの意味に関するドキュメントを見つけた場合はコメントしてください)。svn unlock --force *some_file*
を使用します。次のワンライナーを使用して、2および3を自動化しました。
svn status -u | head -n -1 | awk '{ print $3 }' | xargs svn unlock --force
リポジトリ管理者はロックを(再帰的に)削除して、問題のあるディレクトリ内の数百のファイルを操作できますが、svnadmin rmlocksには--recursiveオプションがないため、スクリプトによってのみ可能です。
$repopath=/var/svn/repos/myproject/;
$problemdirectory=trunk/bikeshed/
IFS=$'\n'; for f in $(Sudo svnadmin lslocks $repopath $problemdirectory \
| grep 'Path: ' \
| sed "s/Path: \///") ; \
do Sudo svnadmin rmlocks $repopath "$f" ; done
このソリューションは、スペースが含まれるファイル名で機能します。
リポジトリサーバーのsvnadminツールにアクセスできる場合、この代替手段を使用してすべてのロックを削除できます(VonCによって投稿されたスクリプトに基づいて)
svnadmin lslocks <path_to_repo> |grep -B2 Owner |grep Path |sed "s/Path: \///" | xargs svnadmin rmlocks <path_to_repo>
最初に提供されたように上記からスクリプトを実行しようとすると、変数を設定しようとしたときにエラーが発生しました:./scriptname:line1:=/svn/repo/path /:No such file or directory ./scriptname: line2:= directory /:そのようなファイルまたはディレクトリはありません
最初の2行から「$」を削除しましたが、これはその後完全に機能しました。
repopath=/var/svn/repos/myproject/;
problemdirectory=trunk/bikeshed/
IFS=$'\n'; for f in $(Sudo svnadmin lslocks $repopath $problemdirectory \
| grep 'Path: ' \
| sed "s/Path: \///") ; \
do Sudo svnadmin rmlocks $repopath "$f" ; done
私にとっては、ファイルを更新しようとした後、チェックサムメッセージが間違っていたため、.svn内のロックファイルを削除できませんでした。
ディレクトリ内でsvn cleanupを実行した後、次のメッセージを受け取りました。
svn:ディレクトリ '' svn: '.svn/tmp/text-base/file_name.svn-base'を 'filename.3.tmp'にコピーできません:そのようなファイルまたはディレクトリはありません
そこで、ファイルを.svn/tmp/text-baseにコピーし、名前をfile_name.svn-baseに変更しました。その後、クリーンアップと更新は正常に機能しました。