web-dev-qa-db-ja.com

TFSリポジトリに対してgit-tfsと慣用的なgitブランチを使用するにはどうすればよいですか?

Git-tfsを慣用的に使用するにはどうすればよいですか?

  • Gitイディオムは、リポジトリのブランチルートディレクトリへをチェックアウトすることです。ブランチをチェックアウトすると、ディレクトリの内容がそのブランチの内容に置き換えられます。

  • TFSのイディオムは、リポジトリのルートディレクトリ(マスターまたはトランクブランチでも)の下にある異なるディレクトリ内の各ブランチをチェックアウトすることです。ブランチをチェックアウトすると、現在のディレクトリの隣の新しいディレクトリに配置されます。

git-tfs を使用して、TFSリポジトリのクローンを作成するか、gitリポジトリに分岐できます。 gitブランチイディオムと一致する方法で複数のブランチを持つTFSリポジトリで作業する。しかし、技術的に何が可能であるか、または推奨されるかはわかりません:)


TFSリポジトリ全体のクローンを作成する

TFSからリポジトリ全体のクローンを作成した場合

> git tfs clone http://<tfsurl>:8080 $/main

これにより、TFSブランチをディレクトリとしてallを含むgitmasterが得られます。

[master]> dir
  trunk
  feature-logon
  feature-search
  release-0.0.1

TFSブランチごとにリモートを追加する

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リポジトリは非常に大きく、実験には長い時間がかかります)

49

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

この新しいコマンドのドキュメントは ここ です。それを改善するためにフィードバックを提供してください...

32
riper

複数のリモート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を実行しました

3
Boklucius

これを実行しながら、マスターとブランチ間の関係を維持する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つの欠点は、トランクから削除されたブランチ内のファイルをクリアできないことです。これはあなたにとって問題かもしれないし、そうでないかもしれません...

3
Joshua