Skip to content

Commit 9fdba2d

Browse files
committed
Review 07-git-tools submodules
1 parent 6de4d0f commit 9fdba2d

File tree

1 file changed

+33
-33
lines changed

1 file changed

+33
-33
lines changed

book/07-git-tools/sections/submodules.asc

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[[_git_submodules]]
22
=== 子模块
33

4-
经常有一种情况是你在一个项目中工作,需要将另一个项目包含在其中使用它
5-
也许是第三方开发的库或者是你单独开发的用在多个父项目中
6-
这些场景中引发了一个常见的问题;你想要将两个项目认为是独立的,还想要在一个中使用另一个。
4+
有一种经常会遇到的情况:你工作中的项目需要包含并使用另一个项目
5+
也许是第三方或者你单独开发的用在多个父项目的库
6+
现在问题来了:你想要把它们看作两个项目独立的项目,还想要在一个中使用另一个。
77

88
这有一个例子。
99
假设你正在开发一个网站然后创建了 Atom 订阅。
@@ -52,7 +52,7 @@ Changes to be committed:
5252
----
5353

5454
首先应当注意到新的 `.gitmodules` 文件。
55-
这是一个配置文件保存项目的 URL 与已经将其拉入的本地目录之间的映射:
55+
这个配置文件保存了项目 URL 与已经将其拉入的本地目录之间的映射:
5656

5757
[source,console]
5858
----
@@ -69,7 +69,7 @@ $ cat .gitmodules
6969

7070
[NOTE]
7171
=====
72-
因为 .gitmodules 文件中的 URL 会是其他人首先尝试克隆/拉取的地方,确保尽可能使用一个他们可以访问的 URL。例如,如果其他人从一个 URL 拉取而你推送到一个不同的 URL,使用其他人可以访问的 URL。为了你自己使用你可以通过 `git config submodule.DbConnector.url PRIVATE_URL` 在本地覆盖这个选项。
72+
因为 .gitmodules 文件中的 URL 会是其他人首先尝试克隆/拉取的地方,尽可能确保使用一个他们都可以访问的 URL。例如,如果其他人从一个 URL 拉取而你推送到一个不同的 URL,使用其他人可以访问的 URL。为了你自己使用你可以通过 `git config submodule.DbConnector.url PRIVATE_URL` 在本地覆盖这个选项。
7373
=====
7474

7575
在 `git status` 输出中列出的另一个是项目文件夹记录。
@@ -195,11 +195,11 @@ Submodule path 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b2
195195

196196
==== 在有子模块的项目上工作
197197

198-
现在我们有一份子模块在其中的项目拷贝,我们将会同时在主项目与子模块项目上与队员协作。
198+
现在我们有一份含有子模块的项目拷贝,我们将会同时在主项目与子模块项目上与队员协作。
199199

200200
===== 拉入上游修改
201201

202-
在项目中使用子模块最简单的模型是只会消费子项目并想要不定期地获得更新,但是在你的检出中却不更改任何信息。
202+
在项目中使用子模块最简单的模型是只会使用子项目并想要不定期地获得更新,但是在你的检出中却不更改任何信息。
203203

204204
如果想要在子模块中查看新工作,可以进入到目录中并运行 `git fetch` 与 `git merge` 上游分支来更新本地代码。
205205

@@ -216,7 +216,7 @@ Fast-forward
216216
2 files changed, 2 insertions(+)
217217
----
218218

219-
现在如果返回到主项目并运行 `git diff --submodule` 会看到子模块被更新了与获得了哪些提交添加进来的列表。如果不想要在每次运行 `git diff` 时输入类型 `--submodle`,你可以通过设置 `diff.submodule` 选项为 ``log'' 将其作为默认行为。
219+
现在如果返回到主项目并运行 `git diff --submodule` 会看到子模块被更新了并获得了一个包含新添加提交的列表。如果不想要在每次运行 `git diff` 时输入类型 `--submodle`,你可以通过设置 `diff.submodule` 选项为 ``log'' 将其作为默认行为。
220220

221221
[source,console]
222222
----
@@ -227,9 +227,9 @@ Submodule DbConnector c3f01dc..d0354fc:
227227
> better connection routine
228228
----
229229

230-
如果这时候提交那么你会将子模块锁定为其他人更新时的新代码
230+
如果在此时提交,那么你会将子模块锁定为其他人更新时的新代码
231231

232-
如果不想要手动地在子目录中抓取与合并,也有一种轻松的方式可以这样做。如果运行 `git submodule update --remote`,Git 将会进入子模块然后抓取并更新。
232+
如果不想要手动地在子目录中抓取与合并,也有一种轻松的方式可以这样做。运行 `git submodule update --remote`,Git 将会进入子模块然后抓取并更新。
233233

234234
[source,console]
235235
----
@@ -259,9 +259,9 @@ From https://github.com/chaconinc/DbConnector
259259
Submodule path 'DbConnector': checked out 'c87d55d4c6d4b05ee34fbc8cb6f7bf4585ae6687'
260260
----
261261

262-
如果不用 `-f .gitmodules` 选项那么它只会为你做修改,但是在仓库中保留跟踪信息更有意义一些因为其他人也可以这样做
262+
如果不用 `-f .gitmodules` 选项那么它只会为你做修改,但是在仓库中保留跟踪信息更有意义一些因为其他人也可以得到同样的效果
263263

264-
当我们在这时候运行 `git status`,Git 会显示我们在子模块中有 ``新提交''。
264+
这时我们运行 `git status`,Git 会显示我们在子模块中有 ``新提交''。
265265

266266
[source,console]
267267
----
@@ -302,7 +302,7 @@ Submodules changed but not updated:
302302
> catch non-null terminated lines
303303
----
304304

305-
在这时候如果运行 `git diff` 可以同时看到我们修改了 `.gitmodules` 文件,也有几个提取下来的提交准备提交到子模块项目中
305+
在这时候如果运行 `git diff` 既可以看到我们修改了 .gitmodules 文件,也可以看到有几个准备提交到子模块项目中的几个提取下来的提交
306306

307307
[source,console]
308308
----
@@ -323,7 +323,7 @@ index 6fc0b3d..fd1cc29 100644
323323
> better connection routine
324324
----
325325

326-
这非常酷因为可以真实地看到将要提交到子模块中的提交的日志。一旦提交,也可以通过运行 `git log -p` 看到这个信息。
326+
这非常酷因为可以真实地看到将要提交到子模块中的提交的日志。提交之后,也可以通过运行 `git log -p` 看到这个信息。
327327

328328
[source,console]
329329
----
@@ -358,9 +358,9 @@ Submodule DbConnector c3f01dc..c87d55d:
358358

359359
所以现在我们将通过一个例子演示同时在子模块与主项目中做修改,并且同时提交与发布那些修改。
360360

361-
到目前为止,当我们运行 `git submodule update` 从子模块仓库中抓取修改时,Git 将会获得这些改动并更新子目录中的文件,但是会将子仓库留在一个称作 ``脱离的 HEAD'' 的状态。这意味着没有本地工作分支(例如 ``master'')跟踪改动。所以任何你做的改动都不会被跟踪
361+
到目前为止,当我们运行 `git submodule update` 从子模块仓库中抓取修改时,Git 将会获得这些改动并更新子目录中的文件,但是会将子仓库留在一个称作 ``脱离的 HEAD'' 的状态。这意味着没有本地工作分支(例如 ``master'')跟踪改动。所以你做的任何改动都不会被跟踪
362362

363-
为了将子模块设置地更轻松地进入与工作,你需要做两件事。需要进入每一个子模块然后检出一个工作的分支。如果你做了改动你需要告诉怎么做然后 `git submodule update --remote` 拉入上游的新工作。选项是你可以合并它们到你的本地工作,或者你可以尝试变基你的工作到新的改动之上。
363+
为了将子模块设置地更轻松地进入与工作,你需要做两件事。需要进入每一个子模块然后检出一个工作的分支。如果你做了改动你要告诉 Git 让它做什么,然后 `git submodule update --remote` 拉入上游的新工作。选项是你可以合并它们到你的本地工作,或者你可以尝试变基你的工作到新的改动之上。
364364

365365
首先,让我们进入子模块目录然后检出一个分支。
366366

@@ -370,7 +370,7 @@ $ git checkout stable
370370
Switched to branch 'stable'
371371
----
372372

373-
让我们尝试用 ``merge'' 选项。为了手工指定它,我们可以仅仅添加 `--merge` 选项给 `update` 调用。这里我们将会看到在服务器上的这个子模块有一个改动并且它被合并了进来。
373+
让我们尝试用 ``merge'' 选项。为了手工指定它,我们可以仅仅给 `update` 添加 `--merge` 选项。这里我们将会看到在服务器上的这个子模块有一个改动并且它被合并了进来。
374374

375375
[source,console]
376376
----
@@ -388,7 +388,7 @@ Fast-forward
388388
Submodule path 'DbConnector': merged in '92c7337b30ef9e0893e758dac2459d07362ab5ea'
389389
----
390390

391-
如果我们进入 DbConnector 目录,可以发现新的改动已经合并入本地 `stable` 分支。现在让我们看看对库做一些我们自己本地的改动而同时其他人推送另外一个修改到上游时会发生什么
391+
如果我们进入 DbConnector 目录,可以发现新的改动已经合并入本地 `stable` 分支。现在让我们看看当我们对库做一些本地的改动而同时其他人推送另外一个修改到上游时会发生什么
392392

393393
[source,console]
394394
----
@@ -419,7 +419,7 @@ Submodule path 'DbConnector': checked out '5d60ef9bbebf5a0c1c1050f242ceeb54ad58d
419419

420420
如果这发生了,不要担心,你可以简单地回到目录中再次检出你的分支(还包含着你的工作的分支)然后手动地合并或变基 `origin/stable` (或任何一个你想要的远程分支)。
421421

422-
在子模块中如果没有提交你的改动那么运行一个子模块更新将会出现问题,Git 会抓取改动但是不会覆盖子模块目录中未保存的工作。
422+
如果你没有提交子模块的改动,那么运行一个子模块更新将会出现问题,Git 会抓取改动但是不会覆盖子模块目录中未保存的工作。
423423

424424
[source,console]
425425
----
@@ -454,7 +454,7 @@ Unable to merge 'c75e92a2b3855c9e5b66f915308390d9db204aca' in submodule path 'Db
454454
[[_publishing_submodules]]
455455
===== 发布子模块改动
456456

457-
现在在我们的子模块目录里有一些改动。其中有一些是我们通过更新从上游引入的而另一些是本地生成的,因为我们还没有推送它们所以对任何其他人都不可用
457+
现在在我们的子模块目录里有一些改动。其中有一些是我们通过更新从上游引入的而另一些是本地生成的,因为我们还没有推送所以它们对任何其他人都不可用
458458

459459
[source,console]
460460
----
@@ -469,7 +469,7 @@ Submodule DbConnector c87d55d..82d2ad3:
469469

470470
如果我们在主项目中提交并推送但并不推送子模块上的改动,其他尝试检出我们修改的人会遇到麻烦,因为他们无法得到依赖的子模块改动。那些改动只存在于我们本地的拷贝中。
471471

472-
为了确保这不会发生,你可以让 Git 在推送到主项目前检查所有子模块是否已推送。`git push` 命令接受可以设置为 ``check'' 或 ``on-demand'' 的 `--recurse-submodules` 参数。如果任何提交的子模块改动没有推送那么 ``check'' 选项会使 `push` 操作直接失败
472+
为了确保这不会发生,你可以让 Git 在推送到主项目前检查所有子模块是否已推送。`git push` 命令接受可以设置为 ``check'' 或 ``on-demand'' 的 `--recurse-submodules` 参数。如果任何提交的子模块改动没有推送那么 ``check'' 选项直接使 `push` 操作失败
473473

474474
[source,console]
475475
----
@@ -491,7 +491,7 @@ to push them to a remote.
491491

492492
如你所见,它也给我们了关于接下来如何做的一些有用的建议。最简单的选项是进入每一个子模块中然后手动推送到远程仓库来确保它们是可以被外部访问到的,然后再次尝试这次推送。
493493

494-
另一个选项是使用 ``on-demand'' 值,将会为你尝试这样做
494+
另一个选项是使用 ``on-demand'' 值,它会尝试为你这样做
495495

496496
[source,console]
497497
----
@@ -605,7 +605,7 @@ $ git commit -m "Merge Tom's Changes" <5>
605605
<4> 解决冲突的子模块记录
606606
<5> 提交我们的合并
607607

608-
它可能有一点困惑,但是它真的不是特别难。
608+
这可能令你有些困惑,但是它真的不是特别难。
609609

610610
有意思的是,有另一个 Git 处理的例子。
611611
如果在子模块目录中存在着一个包含在历史中的 **两边** 提交的合并提交,Git 会向你建议它为一个可行的解决方案。它看到在子模块项目的某一点,有人合并了包含有这两次提交的分支,所以你可能想要那个。
@@ -631,7 +631,7 @@ CONFLICT (submodule): Merge conflict in DbConnector
631631
Automatic merge failed; fix conflicts and then commit the result.
632632
----
633633

634-
它建议你做的是更新索引就像你运行了 `git add` 一样,将会清除冲突,然后提交。然而你可能不应该这样做。你可以轻松地进入子模块目录,查看差异是什么,快进到这次提交,恰当地测试,然后提交它。
634+
它建议你做的是更新索引就像你运行了 `git add` 一样,这将会清除冲突,然后提交。然而你可能不应该这样做。你可以轻松地进入子模块目录,查看差异是什么,快进到这次提交,恰当地测试,然后提交它。
635635

636636
[source,console]
637637
----
@@ -645,7 +645,7 @@ $ git add DbConnector
645645
$ git commit -am 'Fast forwarded to a common submodule child'
646646
----
647647

648-
这完成了同一件事,但是最少这种方式你可以验证是否有效,当完成时在子模块目录中有你的代码
648+
这完成了同一件事,但是通过这种方式你至少可以验证工作是否有效,以及确保当完成时在子模块目录中有你的代码
649649

650650

651651
==== 子模块技巧
@@ -654,7 +654,7 @@ $ git commit -am 'Fast forwarded to a common submodule child'
654654

655655
===== 子模块遍历
656656

657-
有一个 `foreach` 子模块命令可以在每一个子模块运行任意命令。如果你有很多子模块在同一个项目内这真的很有帮助
657+
有一个 `foreach` 子模块命令可以在每一个子模块运行任意命令。如果项目包含大量子模块这会很有用
658658

659659
例如,假设我们想要开始一个新功能或做一个错误修复并且我们在几个子模块中工作。我们可以轻松地在所有的子模块中储藏所有的工作。
660660

@@ -721,7 +721,7 @@ index 1aaefb6..5297645 100644
721721

722722
===== 有用的别名
723723

724-
你可能想要为这些命令中的一些设置一些别名,因为它们可能会非常长而你又不能设置选项作为它们的默认选项。我们在 [[_git_aliases]] 介绍了设置 Git 别名,但是如果你计划在 Git 中大量使用子模块的话这里有一些可能想要设置的别名的例子。
724+
你可能想为其中一些命令设置别名,因为它们可能会非常长而你又不能设置选项作为它们的默认选项。我们在 [[_git_aliases]] 介绍了设置 Git 别名,但是如果你计划在 Git 中大量使用子模块的话这里有一些可能想要设置的别名的例子。
725725

726726
[source,console]
727727
----
@@ -734,7 +734,7 @@ $ git config alias.supdate 'submodule update --remote --merge'
734734

735735
==== 子模块的问题
736736

737-
然而使用子模块并不是没有小问题
737+
然而使用子模块还是有一些小问题
738738

739739
例如在有子模块的项目中切换分支可能会麻烦。
740740
如果你创建一个新分支,在那儿添加一个子模块,然后切换到没有那个子模块的分支时,你还会有一个未跟踪目录的子模块目录。
@@ -770,7 +770,7 @@ Untracked files:
770770
nothing added to commit but untracked files present (use "git add" to track)
771771
----
772772

773-
移除那个目录并不困难,但是有一个目录在那儿会让人有一点困惑。如果你移除它然后切换回有那个子模块的分支,需要运行 `submodule update --init` 来重新弹出它
773+
移除那个目录并不困难,但是有一个目录在那儿会让人有一点困惑。如果你移除它然后切换回有那个子模块的分支,需要运行 `submodule update --init` 来重新建立和填充
774774

775775
[source,console]
776776
----
@@ -789,7 +789,7 @@ $ ls CryptoLibrary/
789789
Makefile includes scripts src
790790
----
791791

792-
再一次,并不是真的很困难,但是它会让人有一点困惑。
792+
这并不是真的很困难,但是它会让人有一点困惑。
793793

794794
另一个主要的警告是许多人遇到了从子目录转换为子模块的问题。
795795
如果在你的项目中你已经跟踪了文件然后你想要将它们移动到一个子模块中,你必须非常小心否则 Git 会对你生气。
@@ -818,8 +818,8 @@ Unpacking objects: 100% (11/11), done.
818818
Checking connectivity... done.
819819
----
820820

821-
现在假设你在一个分支下做的那些
822-
如果尝试切换回一个在实际树中那些文件还存在而不是子模块的分支 - 你会得到这个错误:
821+
现在假设你在一个分支下做了这样的工作
822+
如果尝试切换回的分支中那些文件还在子目录而非子模块中时 - 你会得到这个错误:
823823

824824
[source,console]
825825
----
@@ -832,7 +832,7 @@ Please move or remove them before you can switch branches.
832832
Aborting
833833
----
834834

835-
你可以通过 `check -f` 来强制它切换,但是要小心如果你在那儿有未保存的修改因为通过那个命令它们会被覆盖掉
835+
你可以通过 `check -f` 来强制它切换,但是要小心如果你在那儿有未保存的修改这个命令会把它们覆盖掉
836836

837837
[source,console]
838838
----

0 commit comments

Comments
 (0)