1

誰か (私以外) が誤って TFS のファイルを削除してチェックインしました。その後、彼は自分のエラーを発見し、自分のハード ドライブから失われたファイルを置き換えたいと考えました。彼のエラーと私がそれを発見するまでの間に、他の人が隣接するファイルに変更を加えました。ここで、削除されたファイルを削除前の状態にロールバックしたいのですが、元のファイルとその置換ファイルの間でファイル名の衝突エラーが発生します (正しく理解できれば)。

他の作業が行われたため、プロジェクト全体をロールバックすることはできません。これらのファイルを「以前」の状態に戻したいだけです。

誰かがこの問題を抱えて解決しましたか? それとも解決策がありませんか。

4

3 に答える 3

1

ご意見をお寄せいただきありがとうございます。今後の参考のために、これが私が最終的にケースを解決した方法です。

まず、ファイルのローカル コピーを作成しました。

次に、ソース管理エクスプローラーで、ファイルを含むフォルダーを、古いファイルが削除されたが新しいファイルがまだ存在しない変更セットにロールバックしました。ファイルの削除を取り消してチェックインしたため、元のファイルが「向こうから」戻ってきました。

その後、ローカル コピーと復元されたファイルを差分ツール (BeyondCompare BTW を使用) に入れ、復元されたファイルを新しいバージョンと一致するように修正するというほとんどのケースでした。

いくつかの理由により、これを行うことができました。つまり、次のとおりです。

  • ファイルの削除と再追加は、2 つの連続した変更セットで行われました。
  • 復元されたファイルとローカル コピーの違いは「かなり小さい」ものでした (つまり、メソッドが追加され、別の方法がいくつか変更されています)。

たとえば、問題のファイルを数週間後まで見逃していなかったら、周囲のコードにいくつかの変更が加えられていたとしたら、どうなっていたかわかりません。また、ローカル バージョンに加えられた大幅な変更が、回復可能性に関して何を意味していたのかについてもわかりません。

于 2010-07-01T14:29:21.117 に答える
0
  • ソリューションを別の作業コピーにロールバックします。
  • その作業コピーから削除されたファイルをプルし、それらを現在の作業コピーに戻します
  • これらのファイルを現在のプロジェクトにチェックインします。

ここで確認できる唯一の問題は、削除されたファイルの履歴が失われる可能性があることです。

于 2009-10-20T15:07:55.953 に答える
0

Power Toolsの仕事のようですね。どうぞ:

$deletedFiles = 
    Get-TfsChangeset 12345| 
    % { $_.changes } | 
    ? { $_.changetype.tostring().contains("Delete") } |
    % { $_.item.serveritem }

$deletedFiles | 
    Add-TfsPendingChange -Delete | 
    New-TfsChangeset -Comment "Delete mistakenly re-added files"

$deletedFiles |    
    Get-TfsChildItem -Deleted |
    ? { $_.changesetid -eq 12345 } |
    # this bit of ugliness is required by a bug in the Power Tools
    % { "$($_.serveritem);X$($_.deletionid)" } | 
    Add-TfsPendingChange -Undelete |
    New-TfsChangeset -Comment "Undelete old files"

コメントでほのめかされているように、理想的な Powershell の世界では、最終的なパイプラインでの醜い文字列解析は必要ありません。意図したとおりに機能する場合は、その行を削除できます (または、同等にSelect-TfsItem |に置き換えます)。残念ながら、Power Tools は、私が意図したように削除 ID を処理していないようです。

とにかく、このスクリプトはあなたが求めたことを実行するはずです。ノート:

  • 12368 を、ユーザーが誤ってファイルを削除した変更セットに置き換えます
  • 必要に応じて、2 番目のパイプラインの削除 + チェックインを Destroy に置き換えます。
  • これは、システム内の他の変更 (#12345 の他の変更を含む) を元に戻すことはなく、ファイル名の競合を引き起こしているものだけを元に戻します。
于 2009-10-20T15:46:31.460 に答える