web-dev-qa-db-ja.com

チェンジセットをシェルフセットに変換する

Tfs/tfptでのいくつかの操作だけで、1つのブランチの2つのバージョンの差分からシェルフセットを作成することは可能ですか?

例えばからシェルフセットを作成します(チェンジセット2013->チェンジセット2034)

28
orange

いいえ、できません。チェンジセットとシェルフセットは異なるものであり、目的も異なります。あなたはおそらくあなたが求めていることをするためのプラグインを書くことができます(チェンジセットを取得し、ファイルをチェックアウトし、ファイルを棚上げします)。

3
Daniel Mann

いくつかの制限はありますが、チェンジセットからシェルフセットを作成することは可能です。ブランチから変更をロールバックしてリリースから削除する必要がありましたが、他のブランチにもなかったため、変更をシェルフセットに保持したいと思いました。私はこれを以下のように達成しました:

  • チェンジセットをロールバックし、ロールバックをチェックインします。
  • ロールバックチェンジセットをロールバックします。これにより、元の変更を含む保留中の変更のセットが得られます。
  • 保留中の変更を保留します。

この手法は、質問で説明されているケースに適用できますが、チェンジセットごとに繰り返す必要があるため、手作業が多くなります。また、ロールバックのロールバックもチェックインする必要があるため、TFSで多くの混乱が発生します。

87
Lee Richardson

それは不可能ではありません。技術的に言えば、あなたはそれを行うことができますが、あなたはしたくないかもしれません。読者に決めさせていただきます。

新しいワークスペースでこれを実行することをお勧めします。

  1. 問題のチェンジセットを取得する(新しいコード)
  2. すべてのソースを一時フォルダーに移動します。 ($ tfフォルダーは移動しないでください)。ソースツリーは空になっているはずです。
  3. 以前のチェンジセットを取得します。
  4. 古いコードの上に新しいコードをミラーコピーします
  5. 調整を行います。

これで、シェルブセットを作成できます。

特定のフォルダに焦点を合わせることができれば、それはより速く進み、あなたはそれを自動化することができます。これを行うコマンドラインの例を次に示します。私はそれを試したところ、うまくいきました。

この例では、「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
3
zumalifeguard

このソリューションには純粋なTFSソリューションは含まれていませんが、Lee Richardsonの回答のように、TFSチェンジセットの履歴をいじくり回すことは含まれていません。

Git-TFS を使用してTFSリポジトリまたはブランチのクローンを作成し、前のコミット(TFSチェックイン)から新しいブランチを作成し、新しいコミットから変更を再適用して、それをシェルフセットとして投稿できます。

  1. 変更セットを作成するコミットの前に、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
    
  2. 次のシェルフセットをさかのぼって作成するブランチの前に発生するコミットから、新しいブランチを作成します。

    $ git checkout -b CCCCCCC
    
  3. シェルフセットを作成するコミットからの変更をチェックアウトします。

    $ git checkout BBBBBBB -- .
    
  4. これらのステージングされたファイルをコミットします。

    $ git commit -m "Committing stuff for a retroactive shelveset that does X, Y and Z."
    
  5. シェルフセットを作成します。

    $ git tfs shelve my_retroactive_shelveset HEAD
    

利点

  • これにより、変更セットを元に戻す必要なしにTFS変更セットの履歴がクリーンに保たれ、以前に元に戻された変更セットを元に戻すためのシェルフセットが作成されます。

  • シェルフセットはGitのブランチから作成されたため、そのブランチを削除しても、Git-TFS履歴をクリーンに保つことができます。

デメリット

  • 純粋なTFSソリューションではありません
1
Greg Burghardt