2
2
3
3
(((Interoperation with other VCSs, TFS)))
4
4
(((TFS)))((("TFVC", see="TFS")))
5
- Git 在 Windows 开发者当中变得流行起来,如果你正在 Windows 上编写代码并且正在使用 Microsoft 的 Team Foundation Server (TFS),那会是个好机会 。
6
- TFS 是一个包含工作项目检测与跟踪、Scrum 或其他进度支持 、代码审核、版本控制的协作套件。
7
- 之前这里有一点困惑 :*TFS* 是服务器,它支持通过 Git 与它们自定义的 VCS 来管理源代码,这被他们称为 *TFVC* (Team Foundation Version Control)。
8
- Git 支持 TFS(发布在 2013 版本 )的部分新功能,所以在那之前所有工具都将版本控制部分称为 ``TFS'' ,即使实际上他们大部分时间都在与 TFVC 工作。
5
+ Git 在 Windows 开发者当中变得流行起来,如果你正在 Windows 上编写代码并且正在使用 Microsoft 的 Team Foundation Server (TFS),这会是个好机会 。
6
+ TFS 是一个包含工作项目检测与跟踪、支持 Scrum 与其他流程管理方法 、代码审核、版本控制的协作套件。
7
+ 这里有一点困惑 :*TFS* 是服务器,它支持通过 Git 与它们自定义的 VCS 来管理源代码,这被他们称为 *TFVC* (Team Foundation Version Control)。
8
+ Git 支持 TFS(自 2013 版本起 )的部分新功能,所以在那之前所有工具都将版本控制部分称为 ``TFS'' ,即使实际上他们大部分时间都在与 TFVC 工作。
9
9
10
10
如果发现你的团队在使用 TFVC 但是你更愿意使用 Git 作为版本控制客户端,这里为你准备了一个项目。
11
11
12
- ===== 哪个工具
12
+ ===== 选择哪个工具
13
13
14
14
(((git-tf)))(((git-tfs)))
15
15
实际上,这里有两个工具:git-tf 与 git-tfs。
16
16
17
- Git-tfs (可以 https://github.com/git-tfs/git-tfs[] 找到)是一个 .NET 项目,并且它只能运行在 Windows 上(截至发稿时 )。
18
- 为了与 Git 仓库一起工作,它使用了面向库的允许 Git 内部灵活的扩展性的高性能 Git 实现 libgit2 的 .NET 绑定。
19
- Libgit2 并不是一个完全的 Git 实现,所以在遇到不同时 git-tfs 实际上会调用命令行 Git 客户端来执行某些操作 ,因此在操作 Git 仓库时并没有任何功能限制。
20
- 因为它使用 Visual Studio 程序集与服务器操作,它对 TFVC 的支持非常成熟。
17
+ Git-tfs (可以在 https://github.com/git-tfs/git-tfs[] 找到)是一个 .NET 项目,它只能运行在 Windows 上(截至文章完成时 )。
18
+ 为了操作 Git 仓库,它使用了 libgit2 的 .NET 绑定,一个可靠的面向库的 Git 实现,十分灵活且性能优越 。
19
+ Libgit2 并不是一个完整的 Git 实现,为了弥补差距 git-tfs 实际上会调用 Git 命令行客户端来执行某些操作 ,因此在操作 Git 仓库时并没有任何功能限制。
20
+ 因为它使用 Visual Studio 程序集对服务器进行操作,所以它对 TFVC 的支持非常成熟。
21
21
这并不意味着你需要接触那些程序集,但是意味着你需要安装 Visual Studio 的一个最近版本(2010 之后的任何版本,包括 2012 之后的 Express 版本),或者 Visual Studio SDK。
22
22
23
- Git-tf(主页在 https://gittf.codeplex.com[])是一个 Java 项目,正在如此它可以运行在任何一个有 Java 运行时环境的电脑上。
24
- 它通过 JGit(一个 Git 的 JVM 实现)来于 Git 仓库交互,这意味着事实上它没有 Git 功能上的限制。
23
+ Git-tf(主页在 https://gittf.codeplex.com[])是一个 Java 项目,因此它可以运行在任何一个有 Java 运行时环境的电脑上。
24
+ 它通过 JGit(一个 Git 的 JVM 实现)来与 Git 仓库交互,这意味着事实上它没有 Git 功能上的限制。
25
25
然而,相对于 git-tfs 它对 TFVC 的支持是有限的 - 例如,它不支持分支。
26
26
27
27
所以每个工具都有优点和缺点,每个工具都有它适用的情况。
28
28
我们在本书中将会介绍它们两个的基本用法。
29
29
30
30
[NOTE]
31
31
====
32
- 你需要有一个 TFVC 基础的仓库来执行后续的指令 。
32
+ 你需要有一个基于 TFVC 的仓库来执行后续的指令 。
33
33
现实中它们并没有 Git 或 Subversion 仓库那样多,所以你可能需要创建一个你自己的仓库。
34
34
Codeplex (https://www.codeplex.com[]) 或 Visual Studio Online (http://www.visualstudio.com[]) 都是非常好的选择。
35
35
====
36
36
37
37
38
- ===== 开始 :`git-tf`
38
+ ===== 使用 :`git-tf`
39
39
40
40
和其它任何 Git 项目一样,你要做的第一件事是克隆。
41
41
使用 `git-tf` 克隆看起来像这样:
@@ -45,7 +45,7 @@ Codeplex (https://www.codeplex.com[]) 或 Visual Studio Online (http://www.visua
45
45
$ git tf clone https://tfs.codeplex.com:443/tfs/TFS13 $/myproject/Main project_git
46
46
----
47
47
48
- 第一个参数是一个 TFVC 收藏集的 URL,第二个参数是 `$/project/branch` 的形式,第三个参数是将要创建的本地 Git 仓库路径(最后一项可以省略)。
48
+ 第一个参数是一个 TFVC 集的 URL,第二个参数类似于 `$/project/branch` 的形式,第三个参数是将要创建的本地 Git 仓库路径(最后一项可以省略)。
49
49
Git-tf 同一时间只能工作在一个分支上;如果你想要检入一个不同的 TFVC 分支,你需要从那个分支克隆一份新的。
50
50
51
51
这会创建一个完整功能的 Git 仓库:
@@ -57,7 +57,7 @@ $ git log --all --oneline --decorate
57
57
512e75a (HEAD, tag: TFS_C35190, origin_tfs/tfs, master) Checkin message
58
58
----
59
59
60
- 这叫做 _shallow_ 克隆,意味着只下载了最新的变更集。
60
+ 这叫做 _浅_ 克隆,意味着只下载了最新的变更集。
61
61
TFVC 并未设计成为每一个客户端提供一份全部历史记录的拷贝,所以 git-tf 默认行为是获得最新的版本,这样更快一些。
62
62
63
63
如果愿意多花一些时间,使用 `--deep` 选项克隆整个项目历史可能更有价值。
@@ -81,11 +81,11 @@ d44b17a (HEAD, tag: TFS_C35190, origin_tfs/tfs, master) Goodbye
81
81
----
82
82
83
83
注意名字类似 `TFS_C35189` 的标签;这是一个帮助你知道 Git 提交与 TFVC 变更集关联的功能。
84
- 这是一种表示它的优雅的方式 ,因为通过一个简单的 log 命令就可以看到你的提交是如何与 TFVC 中已存在快照关联起来的。
84
+ 这是一种优雅的表示方式 ,因为通过一个简单的 log 命令就可以看到你的提交是如何与 TFVC 中已存在快照关联起来的。
85
85
它们并不是必须的(并且实际上可以使用 `git config git-tf.tag false` 来关闭它们)- git-tf 会在 `.git/git-tf` 文件中保存真正的提交与变更集的映射。
86
86
87
87
88
- ===== 开始 :`git-tfs`
88
+ ===== 使用 :`git-tfs`
89
89
90
90
Git-tfs 克隆行为略为不同。
91
91
观察:
@@ -105,7 +105,7 @@ C17 = d202b53f67bde32171d5078968c644e562f1c439
105
105
C18 = 44cd729d8df868a8be20438fdeeefb961958b674
106
106
----
107
107
108
- 注意 `--with-branches` 标记 。
108
+ 注意 `--with-branches` 选项 。
109
109
Git-tfs 能够映射 TFVC 分支到 Git 分支,这个标记告诉它为每一个 TFVC 分支建立一个本地的 Git 分支。
110
110
强烈推荐曾经在 TFS 中新建过分支或合并过分支的仓库使用这个标记,但是如果使用的服务器的版本比 TFS 2010 更老 - 在那个版本前,``分支'' 只是文件夹,所以 git-tfs 无法将它们与普通文件夹区分开。
111
111
@@ -140,7 +140,7 @@ Git-tfs 使用这些标记而不是标签来关联 TFVC 变更集与 Git 提交
140
140
141
141
[NOTE]
142
142
====
143
- 无论你使用哪个工具,需要先设置几个 Git 配置选项来避免一大堆问题 。
143
+ 无论你使用哪个工具,都需要先设置几个 Git 配置选项来避免一些问题 。
144
144
145
145
[source,console]
146
146
----
@@ -154,8 +154,8 @@ TFVC 与 TFS 有几个功能可能会增加你的工作流程的复杂性:
154
154
155
155
. TFVC 无法表示特性分支,这会增加一点复杂度。
156
156
这会导致需要以 *非常* 不同的方式使用 TFVC 与 Git 表示的分支。
157
- . 要意识到 TFVC 允许用户从服务器上 ``checkout '' 文件并锁定它们,这样其他人就无法编辑了。
158
- 这显示它不会阻止你在本地仓库中编辑它们 ,但是当推送你的修改到 TFVC 服务器时会出现问题。
157
+ . 要意识到 TFVC 允许用户从服务器上 ``检出 '' 文件并锁定它们,这样其他人就无法编辑了。
158
+ 显然它不会阻止你在本地仓库中编辑它们 ,但是当推送你的修改到 TFVC 服务器时会出现问题。
159
159
. TFS 有一个 ``封闭'' 检入的概念,TFS 构建-测试循环必须在检入被允许前成功完成。
160
160
这使用了 TFVC 的 ``shelve'' 功能,我们不会在这里详述。
161
161
可以通过 git-tf 手动地模拟这个功能,并且 git-tfs 提供了封闭敏感的 `checkintool` 命令。
@@ -181,7 +181,7 @@ $ git log --oneline --graph --decorate --all
181
181
----
182
182
183
183
我们想要拿到在 `4178a82` 提交的快照并将其推送到 TFVC 服务器。
184
- 先说重要的:让我们看看自从上次连接后我们的队友是否做了一些事情 :
184
+ 先说重要的:让我们看看自从上次连接后我们的队友是否进行过改动 :
185
185
186
186
[source,console]
187
187
----
@@ -203,7 +203,7 @@ $ git log --oneline --graph --decorate --all
203
203
Team Project Creation Wizard
204
204
----
205
205
206
- 看起来其他人也做了一些事情 ,现在我们有一个分叉的历史。
206
+ 看起来其他人也做了一些改动 ,现在我们有一个分叉的历史。
207
207
这就是 Git 的优势,但是我们现在有两种处理的方式:
208
208
209
209
. 像一名 Git 用户一样自然的生成一个合并提交(毕竟,那也是 `git pull` 做的),git-tf 可以通过一个简单的 `git tf pull` 来帮你完成。
@@ -233,7 +233,7 @@ $ git log --oneline --graph --decorate --all
233
233
----
234
234
235
235
现在我们准备好生成一个检入来推送到 TFVC 服务器上了。
236
- Git-tf 给你一个将自上次修改(默认的 `--shallow`)以来所有的修改生成的一个单独的变更集以及为每一个 Git 提交(`--deep`)生成的一个新的变更集。
236
+ Git-tf 给你一个将自上次修改(即 `--shallow` 选项,默认启用 )以来所有的修改生成的一个单独的变更集以及为每一个 Git 提交(`--deep`)生成的一个新的变更集。
237
237
在本例中,我们将会创建一个变更集:
238
238
239
239
[source,console]
@@ -259,7 +259,7 @@ $ git log --oneline --graph --decorate --all
259
259
要重点注意的是,不是每一个 Git 提交都需要在 TFVC 中存在一个相同的副本;例如 `6eb3eb5` 提交,在服务器上并不存在。
260
260
261
261
这就是主要的工作流程。
262
- 这里有一些你需要考虑的其他注意事项 :
262
+ 有一些你需要考虑的其他注意事项 :
263
263
264
264
* 没有分支。
265
265
Git-tf 同一时间只能从一个 TFVC 分支创建一个 Git 仓库。
@@ -285,7 +285,7 @@ PS> git log --oneline --graph --all --decorate
285
285
* b75da1a New project
286
286
----
287
287
288
- 让我们看一下在我们工作时有没有人完成其它的一些工作 :
288
+ 让我们看一下在我们工作时有没有人完成一些其它的工作 :
289
289
290
290
[source,powershell]
291
291
----
@@ -307,10 +307,10 @@ PS> git log --all --oneline --graph --decorate
307
307
308
308
与 git-tf 相同,我们有两种基础选项来解决这个分叉历史问题:
309
309
310
- . 变基来保持一条直线的历史 。
311
- . 合并来保持真正发生的事情 。
310
+ . 通过变基来保持历史是线性的 。
311
+ . 通过合并来保留改动 。
312
312
313
- 在本例中,我们将要做一个 ``deep '' 检入,也就是说每一个 Git 提交会变成一个 TFVC 变更集,所以我们想要变基。
313
+ 在本例中,我们将要做一个 ``深 '' 检入,也就是说每一个 Git 提交会变成一个 TFVC 变更集,所以我们想要变基。
314
314
315
315
[source,powershell]
316
316
----
@@ -329,7 +329,7 @@ PS> git log --all --oneline --graph --decorate
329
329
* b75da1a New project
330
330
----
331
331
332
- 现在已经准备好通过检入我们的代码到 TFVC 服务器来完成我们的贡献 。
332
+ 现在已经准备好通过检入我们的代码到 TFVC 服务器来完成贡献 。
333
333
我们这里将会使用 `rcheckin` 命令将 HEAD 到第一个 `tfs` 远程分支间的每一个 Git 提交转换为一个 TFVC 变更集(`checkin` 命令只会创建一个变更集,有些类似于压缩 Git 提交)。
334
334
335
335
[source,powershell]
0 commit comments