4

どちらも機能していない--deepよう--shallowに見えます。git-tf checkin --deepTFS の新しいフォルダー (現在は空)に対して実行しようとすると、エラーが発生します。私はかなりの歴史を持つ git リポジトリを持っています。git-tf の一部として TFS を保持/移行したいと考えています。

私の理解では、checkin --deepコミットごとに TFS に類似の変更セットが作成されます。問題は、マージの結果であると思われる git リポジトリ内のコミット (そして、このリポジトリには多くのマージがあります) がgit-tfコマンドを非常に不幸なものにし、タイトルで言及したエラー メッセージを報告することです ( [commitid] の例外は、実際のコミット ID に置き換えられます (例: 9a26d8))。

ここでボートを完全に見逃しているのか、それとも何なのかわかりません。履歴に複数のマージコミットがある既存の git リポジトリを TFS に移植する信頼できる方法はありますか? これは原始的な機能/修正であると予想していました。何かが足りないことを願っています。私は TFS に非常に精通していますが、git には慣れていないので、助けていただければ幸いです。

4

1 に答える 1

16

ここでの問題は、複雑なマージ履歴を TFS で表現するのが難しいことです。簡単に言うと、Git コミットは複数の親を持つことができますが、TFS チェンジセットは 1 つしか持てません。

私のgitリポジトリが何らかのコミットでHEADを持っている状態を考えてみましょう9c42ef.... ここで、変更を加えてコミットし、新しい commit を作成し1f23cd...ます。一方、Bob からも変更を加えています。これも .NET ベースのコミットです9c42ef...。彼の変更は commit IDf41ac3...です。両方の変更を組み込みたい場合は、マージを行う必要があります。最終的に commit ID になるとしましょう7acdfe...。グラフは次のようになります。

          1f23cd
        /        \
9c42ef             7acdfe (HEAD)
        \        /
          f41ac3

これは TFS では簡単に表すことができません。これは、1 つの変更セットが 1 つの祖先 (その直前の変更セット) しか持てないためです。したがって、履歴を線形化する必要があります。--squashこれが、および--auto-squashオプションが存在する理由ですgit-tf checkin(ディープ チェックインを実行する場合)。

この--squashオプションを使用すると、履歴をたどる際にたどるパスを選択できます。例えば:

git-tf checkin --deep --squash f41ac3

を省略してグラフをたどると、とf41ac3の内容の 3 つの変更セットができます。しかし、大きなグラフでは、各コミットをスカッシュに指定するのは大変な作業です。その場合、進むべき道を決定するためにいくつかの魔法を使用します。(可能な限り多くの履歴を取得できるように、コミットのチェーンが最も長いパスを優先し、2 つのセグメントの長さが同じ場合は、タイムスタンプを使用してどのパスに従うかを決定します。)9c42ef1f23cd7acdfe--auto-squash

git-tf checkin --deep --auto-squash

チェックインしているコミットが線形で、それぞれが単一の親しか持たないようにリベースすることもできます。

git-tf開発者は、ツリーの複雑さ、SHA1 ハッシュの無限の文字列を入力することに対する自虐的な感情、および月の満ち欠けに応じて、これらの各戦略を使用します。

于 2012-08-22T14:19:59.870 に答える