TFS接続ソリューションから最新バージョンを取得することを選択し、[キャンセル]を押しました。この操作はトランザクションです。つまり、[最新バージョンの取得]コマンドをキャンセルすると、操作全体がキャンセルされますか、コードの一部を取得して残りのファイルをキャンセルしますか?
私のマシン:
TFS 2010
VS 2010 SP1
TFS接続ソリューションから最新バージョンを取得することを選択し、[キャンセル]を押しました。この操作はトランザクションです。つまり、[最新バージョンの取得]コマンドをキャンセルすると、操作全体がキャンセルされますか、コードの一部を取得して残りのファイルをキャンセルしますか?
私のマシン:
TFS 2010
VS 2010 SP1
TL;DR:はい、作業フォルダー内の一部のファイルが要求された変更セットにあり、一部のファイルが以前の変更セットにある状態になる可能性があります。そのバージョンに「ロールバック」するために、以前のバージョンを取得したい場合があります。
何が起こっているかを確認するために、これを get を実行するときに実行される実際のステップに分解できます。
最初に、クライアントはサーバーに特定のバージョンを取得するように要求します。サーバーは、現在の変更セットから要求された変更セットに移動するために、どのファイルを転送する必要があるかを計算します。これらは、一連の「取得操作」としてクライアントに返されます。
この時点で、クライアントは get 操作を処理するために複数のスレッドを生成する必要があります。これらのスレッドのほとんどは、データをダウンロードしてディスクに配置するスレッドになります。「ローカル バージョンの更新」をサーバーに送信する専用のスレッドが追加されます。
ダウンロード スレッドは、サーバーから返されたリストから get 操作を取得し、ディスクの一時的な場所にダウンロードします。ダウンロードが完了すると、ファイルは永続的な場所に移動され、ファイルが完全にダウンロードされたことをローカル バージョンの更新を送信するスレッドに通知されます。
ローカル バージョン更新メッセージは非常に小さく、一度に 1 つずつ送信すると不要なネットワーク オーバーヘッドが発生するため、ローカル バージョン更新スレッドは、一定数に達するまで、ダウンローダ スレッドからのローカル バージョン更新をバッチ処理します。ローカル バージョン更新スレッドが十分な更新を蓄積すると、サーバーに送信されます。これは、クライアントが要求したファイルのバージョンがあることをサーバーが認識した時点です。
ダウンロード スレッドは、処理するものがなくなるまで引き続き get 操作を実行し、ローカル バージョン更新スレッドは、すべてのダウンロード スレッドのダウンロードが終了し、すべてのローカル バージョン更新がサーバーに送信されるまで続行されます。これらが発生すると、get は終了します。
クライアントがキャンセルをサポートする場合、そのロジックは次のようになります。ユーザーがキャンセルを要求した場合 (たとえば、UI ベースのクライアントで「キャンセル」ボタンを押すことによって)、すべてのダウンロード ワーカー スレッドにキャンセルするよう通知する必要があります。ファイルのダウンロード中の場合は、すぐに停止する必要があります (読み取っている HTTP 応答を破棄するだけです)。ただし、ファイルを一時的な場所から永続的な場所に移動したら、ローカル バージョンに通知する必要があります。終了する前にスレッドを更新します。ローカル バージョン更新スレッドは、すべてのダウンロード スレッドが終了するまで待機し、終了する前に未処理のローカル バージョン更新をフラッシュする必要があります。
したがって、取得の途中でキャンセルした場合、ダウンロードしようとしていたファイルの一部がディスク上にある可能性がありますが、クライアントとサーバーは各ファイルのバージョンの一貫したビューを持っている必要があります。
クライアントを強制終了して、ワーカー スレッドをきれいに停止できなかった場合 (たとえば、コンピューターの電源をオフにするだけで)、アイテムがディスクにコミットされた状態になる可能性があります。しかし、クライアントはまだローカル バージョンの更新をサーバーにフラッシュしていませんでした。この場合、サーバーが別のバージョンを持っていると認識していても、ディスク上にバージョンがある可能性があります。万一これが発生する場合は、この問題を調整するためにこのファイルを取得するときに「強制」オプションを使用する必要があります。
トランザクションではありません。一部のファイルは既にダウンロードされている可能性があります。この場合、リクエストをキャンセルした後に特定のバージョンを取得する必要があります。
私の経験では、「キャンセル」を押すと、ディスク上にあるバージョンと、TFS がディスク上にあると考えるバージョンとの間に違いが生じます。したがって、再度更新しようとしても、サーバーは既に最新バージョンを持っていると見なすため、何もダウンロードされません。