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

如何惯用git-tfs?

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

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

使用git-tfs,我可以将TFS存储库克隆或分支到git存储库中。 我想以与git branching习惯用法一致的方式在具有多个分支的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仓库很大,实验需要很长时间)

Anthony Mastrean asked 2020-02-13T08:02:35Z
3个解决方案
32 votes

如果使用git-tfs进行克隆,现在可以使TFS分支成为正确的Git分支。 现在已发布稳定版! 首先,您不是克隆整个存储库,而是克隆主干:

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

然后运行--with-branches,它会在Git存储库中创建一个新分支

git tfs branch --init $/MyProject/MyTFSBranch

在您的情况下:

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

或使用新克隆的存储库上的--with-branches标志创建TFS服务器上存在的所有分支。

git tfs branch --init --all

您还可以使用标记--with-branches直接与所有分支进行克隆:

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

此新命令的文档在这里。 随时提供反馈以改进它...

riper answered 2020-02-13T08:03:19Z
3 votes

这是您可以执行此操作的一种方法,并且仍然可以保持master和分支之间的某些关系。 您可能想要编写脚本。 对不起,如果我使用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"

这不是完美的,但最终所有分支都从master克隆而来,或多或少地适当扩散。 如果您用另一个文件覆盖一个文件,但内容没有变化,则AFAIK git应该很好,这可以使所有工作正常。

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

Joshua answered 2020-02-13T08:04:39Z
3 votes

多个远程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回购)的哈希值和父提交ID(手动查找)的哈希值

PS:我收到错误消息:指定的git信息库目录也不为空(之前不知道它是如何工作的),因此我在.git / config中手动添加了第二个url并做了git tfs fetch -i Branch1

Boklucius answered 2020-02-13T08:05:23Z
translate from https://stackoverflow.com:/questions/5129959/how-do-i-use-git-tfs-and-idiomatic-git-branching-against-a-tfs-repository