如何针对TFS存储库使用git-tfs和idiomatic git分支?

时间:2011-02-26 21:47:02

标签: git tfs git-branch git-tfs

如何正常使用git-tfs?

  • git惯用法是将分支签出到存储库的根目录。签出分支将用该分支的内容替换目录的内容。

  • TFS习惯用法是检查存储库根目录下的不同目录中的每个分支(甚至是主分支或主干分支)。签出分支会将其放在当前分区旁边的新目录中。

使用git-tfs,我可以克隆TFS存储库或分支到git存储库。我想以与git分支习语一致的方式在具有多个分支的TFS存储库上工作。但我不确定技术上可行或推荐的是什么:)


克隆整个TFS存储库

如果我从TFS克隆整个存储库

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

这会给我一个git master包含所有 TFS分支作为目录。

[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回购非常大,试验需要很长时间)

3 个答案:

答案 0 :(得分:31)

如果使用git-tfs克隆,现在可以让TFS分支正确Git分支。现在处于稳定版本!你首先克隆的不是整个存储库而是trunk:

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

此新命令的文档为here。随意提供反馈以改善它...

答案 1 :(得分:3)

这是你可以做到这一点的一种方式,并且仍然保持主人和分支之间的某些关系。您可能想要编写脚本。如果我在某些示例中使用bash语句而不是windows命令行,请原谅。

首先克隆整个存储库,如第一个示例所示,将分支作为目录。

这会将主干移动到根目录。 (希望与您的分支文件夹没有冲突)

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应该没问题,这样就可以完成所有工作。

一个缺点是您不会清除已从主干中删除的分支中的任何文件。这对你来说可能是一个问题,也可能不是......

答案 2 :(得分:3)

多个远程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

为了能够轻松合并两条线,创建一个移植物:

echo branch-commit-id trunk-parent-id > .git/infos/grafts

其中id是第一个分支提交的哈希值(来自Releases repo)和父提交id(手动查找)

PS:我得到错误:指定的git存储库目录也不是空的(之前不知道它是如何工作的),所以我在.git / config中手动添加了第二个url并且执行了git tfs fetch -i Branch1 < / p>