我如何使用git-tfs和惯用的git分支来对付TFS库?

如何按照习惯使用git-tfs?

  • git的用法是检出分支版本库的根目录 。 检出分支将用该分支的内容replace该目录的内容。

  • TFS习惯用法是检查存储库根目录下的不同目录中的每个分支 (即使是master或trunk分支)。 检出一个分支将把它放在一个新的目录旁边。

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


克隆整个TFS信息库

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

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

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

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

添加一个远程每个TFS分支

我不知道是否可以(或如何)将git remote映射到每个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仓库中创build一个新的分支

 git tfs branch --init $/MyProject/MyTFSBranch 

在你的情况下:

 git tfs branch --init $/main/feature-logon 

或者使用全新克隆的存储库上的--all标志来创buildTFS服务器上的所有分支。

 git tfs branch --init --all 

您也可以使用标志--with-branches直接克隆所有--with-branches

 git tfs clone http://<tfsurl>:8080 $/main/trunk --with-branches 

这个新命令的文档在这里 。 随时提供反馈,以改善它…

这里有一个方法可以做到这一点,并仍然保持主人和分支机构之间的一些关系。 你可能想要编写脚本。 对不起,如果我使用bash语句,而不是Windows命令行的一些例子

首先将整个存储库克隆出来,就像在第一个例子中一样,将分支作为目录。

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

 mv trunk/*.* . 

提交你的新主人

 git commit -a -m "refactoring master" 

创build一个新的分支

 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" 

这不是完美的,但是你最终会把你所有的分支都克隆出来,并且或多或less的适当分配。 如果用另一个文件覆盖文件,AFAIK git应该没问题,但是内容不会改变,这样就可以工作了。

一个缺点是你不会清除分支中已经被删除的任何文件。 这可能是也可能不是你的问题…

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

那么你可以为每个远程分支创build一个分支: git checkout -b localbranch1 tfs/Branch1并提交到tfs分支git tfs ct -i branch1

为了能够轻松地合并这两条线创build一个嫁接:

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

其中ids是第一个分支提交(来自Releases回购)和一个父提交ID(手动查找)的散列,

PS:我得到的错误:指定的git仓库目录也不是空的(不知道它是如何工作的),所以我手动添加第二个URL在.git /configuration,并没有git tfs fetch -i Branch1