Gitイディオムは、リポジトリのブランチルートディレクトリへをチェックアウトすることです。ブランチをチェックアウトすると、ディレクトリの内容がそのブランチの内容に置き換えられます。
TFSのイディオムは、リポジトリのルートディレクトリ(マスターまたはトランクブランチでも)の下にある異なるディレクトリ内の各ブランチをチェックアウトすることです。ブランチをチェックアウトすると、現在のディレクトリの隣の新しいディレクトリに配置されます。
git-tfs を使用して、TFSリポジトリのクローンを作成するか、gitリポジトリに分岐できます。 gitブランチイディオムと一致する方法で複数のブランチを持つTFSリポジトリで作業する。しかし、技術的に何が可能であるか、または推奨されるかはわかりません:)
TFSからリポジトリ全体のクローンを作成した場合
> git tfs clone http://<tfsurl>:8080 $/main
これにより、TFSブランチをディレクトリとしてallを含むgitmaster
が得られます。
[master]> dir
trunk
feature-logon
feature-search
release-0.0.1
Gitリモートを各TFSブランチにマップできるかどうか(またはその方法)がわかりません。
> git init .
[master]> git tfs clone http://<url> $/main/trunk .
次に
[master]> git checkout -b feature-logon
[feature-logon]> git tfs clone http://<url> $/main/feature-logon .
これが技術的に正しくないことは知っていますが、プレイしないとそれ以上のことはわかりません(私の唯一のTFSリポジトリは非常に大きく、実験には長い時間がかかります)
git-tfs を使用してクローンを作成する場合、TFSブランチを正しいGitブランチにすることができるようになりました。これは現在、安定版リリースです!最初に、リポジトリ全体ではなくトランクのクローンを作成します。
git tfs clone http://<tfsurl>:8080 $/main/trunk
次に、branch --init
を実行します。これにより、Gitリポジトリに新しいブランチが作成されます。
git tfs branch --init $/MyProject/MyTFSBranch
あなたの場合:
git tfs branch --init $/main/feature-logon
または、新しく複製されたリポジトリで--all
フラグを使用して、TFSサーバーに存在するすべてのブランチを作成します。
git tfs branch --init --all
フラグ--with-branches
を使用して、すべてのブランチで直接クローンを作成することもできます。
git tfs clone http://<tfsurl>:8080 $/main/trunk --with-branches
この新しいコマンドのドキュメントは ここ です。それを改善するためにフィードバックを提供してください...
複数のリモートtfs-repos、ブランチごとに1つはどうですか?私は次の構造を持っています:
$/Root/Main/someproject (the trunk)
$/Root/Releases/Branch1/someproject
$/Root/Releases/Branch2/someproject
私がしたこと
git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Trunk GitRepo
git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch1 GitRepo -i
branch1
git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch2 GitRepo -i branch2
次に、リモートブランチごとにブランチを作成できます。git checkout -b localbranch1 tfs/Branch1
そしてtfsブランチにコミットしますgit tfs ct -i branch1
2つの線を簡単にマージできるようにするには、グラフトを作成します。
echo branch-commit-id trunk-parent-id > .git/infos/grafts
ここで、idは最初のブランチコミット(リリースリポジトリから)のハッシュと親コミットID(手動で検索)です。
PS:エラーが発生します:指定されたgitリポジトリディレクトリも空ではありません(以前はどのように機能したかわかりません)ので、.git/configに2番目のURLを手動で追加し、git tfs fetch -iBranch1を実行しました
これを実行しながら、マスターとブランチ間の関係を維持する1つの方法を次に示します。あなたはおそらくそれをスクリプト化したいと思うでしょう。いくつかの例でWindowsコマンドラインではなくbashステートメントを使用している場合はすみません
最初の例のように、最初にディレクトリとしてブランチを使用して、リポジトリ全体のクローンを作成します。
これにより、トランクがルートに移動します。 (ブランチフォルダとの競合がないことを願っています)
mv trunk/*.* .
新しいマスターをコミットする
git commit -a -m "refactoring master"
新しいブランチを作成する
git checkout -b feature-login
ルートファイルにブランチファイルをコピーします
mv feature-login/*.* .
ここではもう必要ありません
rm -rf [all_branch_directories]
ブランチをコミットする
git commit -a -m "refactoring feature-login"
マスターに戻る
git checkout master
再びそれをすべて行います
git checkout -b next_branch
などなど。
最後に最後に
git checkout master
rm -rf [all_branch_directories]
git commit -a -m "refactoring master"
完璧ではありませんが、すべてのブランチがマスターから複製され、多かれ少なかれ適切に差分されてしまいます。 AFAIK gitは、ファイルを別のファイルで上書きしても問題がないはずですが、内容は変更されないため、これですべてが機能します。
1つの欠点は、トランクから削除されたブランチ内のファイルをクリアできないことです。これはあなたにとって問題かもしれないし、そうでないかもしれません...