VisualStudio.com改めAzure DevOpsでTFSサーバを建てていて、チェックアウトしたまま従業員などが退職するなどしてTFSのユーザアカウントを消してしまうと、単純なtf undoではチェックアウトを取り消せない問題が発生します。
おさらい(TFSにアカウントが残っている場合の手順)
TFSアカウントを消していない場合は以下の方法が使えます。
tf undo /collection:"コレクション" /workspace:"ワークスペース";"ユーザー" "取消ファイルサーバーパス"
(配下のフォルダやファイル全てに…という場合は/recursiveオプションを付ける)
tf undo /recursive /collection:"コレクション" /workspace:"ワークスペース";"ユーザー" "取消ファイルサーバーパス"
例)
tf undo /collection:"https://hogehoge.visualstudio.com/" /workspace:"wkname;username" $/Tools/Test/*.*
ここで必要となるコレクションはAzure Devopsの場合はプロジェクトのURLになります。
ワークスペース、ユーザは勿論tf workspaceでも調べられます。
tf workspaces /collection:"コレクション" /owner:*
が、VS2017が入っているのであればTFSサーバにVS2017でログインし、チームエクスプローラでターゲットとなるファイルを右クリックし、「詳細」→「プロパティ」で開けるプロパティ画面の「状態」タブから確認した方がグラフィカルに確認は出来ます。
チェックアウト一覧が見たいのであれば以下のコマンドで実行出来ます。
tf status /collection:"コレクション" /user:*
が、TFSのユーザアカウントをAzure Devopsへのログインユーザ一から(チェックアウト取り消しの前に)除却してしまうと、このtf undoコマンドが以下のようなエラーと共に失敗します。
>tf undo /collection:https://hogehoge.visualstudio.com/ /workspace:"wkname;username" $/Tools/Test/*.*
TF14061: The workspace wkname;username does not exist.
どうすればいいか?(TFSにアカウントが残っていない場合の手順)
このようなケースでは、対象となるワークスペース自体を消すことによってチェックアウトを取り消すことができます。
https://stackoverflow.com/questions/37246040/how-can-i-remove-fix-a-ghost-workspace
1.tf workspacesの実行
tf workspacesはXML形式での出力をするとワークスペース毎の詳細な情報が取得できます。よってそれをまず出力します。
tf workspaces /collection:"コレクション" /owner:* /format:xml
(テキストファイルに出力したい場合)
tf workspaces /collection:"コレクション" /owner:* /format:xml > C:\output.txt
2.書き出されたXMLの検索
エディタで開き、消したいワークスペースとユーザで検索します。
以下のような、消したいワークスペース・ユーザのレコードの塊を見つけ出します。
<Workspace computer="PC名" name="wkname" ownerdisp="user" ownerid="5f84b85f-be1f-4a6a-a282-96fee77fab20\useraddress@example.com" ownertype="Microsoft.IdentityModel.Claims.ClaimsIdentity" owner="12345678-90ab-cdef-1234-567890abcdef" owneruniq="12345678-90ab-cdef-1234-567890abcdef">
<Comment />
<LastAccessDate>2024-04-23T11:27:49.877+09:00</LastAccessDate>
<OwnerAliases>
<string>5f84b85f-be1f-4a6a-a282-96fee77fab20\lunarkx201@gmail.com</string>
<string>useraddress@example.com</string>
<string>user</string>
</OwnerAliases>
</Workspace>
この情報から、ワークスペース名とowneruniqの値を取得します。上記の例だとそれぞれ
・ワークスペース:wkname
・owneruniq:12345678-90ab-cdef-1234-567890abcdef
となります。
3.ワークスペースの消去
当然、このようなユーザが存在しないワークスペースは存在意義がないので、サーバワークスペースを消すコマンドを実行します。
tf workspace /delete wkname;12345678-90ab-cdef-1234-567890abcdef
実行すると、以下のようなメッセージが出るので「Yes」と打ち込んでENTします。
削除されたワークスペースは復元できません。
サーバー 'https://hogehoge.visualstudio.com/' のワークスペース 'wkname;12345678-90ab-cdef-1234-567890abcdef' は、11 の保留中の変更を含んでいます。
ワークスペースを削除しますか? (Yes/No)
これで消去が可能です。
注意点
TFSアカウントがある場合にワークスペース自体の削除をしてしまうと何がおきるかは確認していないので、消去するワークスペースを探す際には十分にご注意下さい。