49

我如何习惯性地使用 git-tfs?

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

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

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


克隆整个 TFS 存储库

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

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

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

[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 存储库非常大,实验需要很长时间)

4

3 回答 3

32

如果使用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

您还可以使用 flag 直接克隆所有分支--with-branches

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

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

于 2012-12-04T19:53:46.917 回答
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

于 2011-09-07T12:58:18.700 回答
3

这是您可以做到这一点的一种方法,并且仍然保持 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 应该没问题,这允许这一切工作。

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

于 2011-04-06T00:50:24.607 回答