tfs/tfpt でいくつかの操作を行うだけで、1 つのブランチの 2 つのバージョンの差分からシェルブセットを作成することは可能ですか?
たとえば、(changeset 2013 -> changeset 2034) からシェルブセットを作成します。
変更セットからシェルブセットを作成することは可能ですが、いくつかの制限があります。ブランチから変更をロールバックしてリリースから削除する必要がありましたが、他のブランチにもなかったので、変更をシェルブセットに保持したかったのです。私は以下のようにこれを達成しました:
この手法を質問で説明されているケースに適用できますが、変更セットごとに繰り返す必要があるため、多くの手作業が必要になります。また、ロールバックのロールバックもチェックインする必要があるため、TFS で多くの混乱が発生します。
不可能ではありません。技術的に言えば、やりたくないかもしれませんが、それを行うことができます。読者の判断にお任せします。
新しいワークスペースでこれを行うことができます。
これでシェルフセットを作成できます。
特定のフォルダーに集中できる場合は、作業が速くなり、自動化できます。これを行うコマンドラインの例を次に示します。試してみただけでうまくいきました。
この例では、ルートから「Src」というフォルダーを指定しています。ルート フォルダーを変更します。
md tmpws
cd tmpws
tf vc workspace /new /noprompt tmpws /location:local /permission:private
tf vc get "$/Src" /version:C2222 /recursive /noprompt
cd ..
md tmp
move "tmpws\Src" tmp
cd tmpws
tf vc get "$/Src" /version:C1111 /recursive /noprompt /force /overwrite
cd ..
robocopy "tmp\Src" "tmpws\Src" /mir
tf vc reconcile /promote /adds /deletes /diff /recursive /noprompt
tf vc shelve /replace /noprompt mychange
tf vc undo "$/Src" /recursive /noprompt
tf vc workspace /delete tmpws
cd ..
rmdir /q /s tmp
rmdir /q /s tmpws
このソリューションには純粋な TFS ソリューションは含まれていませんが、Lee Richardson の回答のように TFS 変更セットの履歴をいじることはありません。
Git-TFSを使用して TFS リポジトリまたはブランチを複製し、以前のコミット (TFS チェックイン) から新しいブランチを作成し、新しいコミットから変更を再適用して、それをシェルブセットとして投稿できます。
変更セットを作成する前のコミットを探しgit log
ます。
$ git log --oneline
AAAAAAA Newest commit
BBBBBBB The commit for which I want a shelveset
CCCCCCC The commit where I will create a new branch from
さかのぼってシェルブセットを作成するコミットの前に発生したコミットから新しいブランチを作成します。
$ git checkout -b CCCCCCC
シェルブセットを作成するコミットから変更をチェックアウトします。
$ git checkout BBBBBBB -- .
これらのステージングされたファイルをコミットします。
$ git commit -m "Committing stuff for a retroactive shelveset that does X, Y and Z."
シェルフセットを作成します。
$ git tfs shelve my_retroactive_shelveset HEAD
利点
これにより、変更セットを元に戻したり、シェルブセットを作成して以前に元に戻した変更セットを元に戻したりする必要なく、TFS 変更セットの履歴がきれいに保たれます。
シェルブセットは Git のブランチから作成されたものであるため、そのブランチを削除しても、Git-TFS の履歴をクリーンに保つことができます。
短所
コミットごとにシェルブセットが作成されます。したがって、コミットが開始されたときに作成されたシェルブセットを見つけることができます。まったく同じ変更が行われます。新しいシェルフセットを作成する必要はありません。