1
1
[[_git_submodules]]
2
2
=== 子模块
3
3
4
- 经常有一种情况是你在一个项目中工作,需要将另一个项目包含在其中使用它 。
5
- 也许是第三方开发的库或者是你单独开发的用在多个父项目中 。
6
- 这些场景中引发了一个常见的问题;你想要将两个项目认为是独立的 ,还想要在一个中使用另一个。
4
+ 有一种经常会遇到的情况:你工作中的项目需要包含并使用另一个项目 。
5
+ 也许是第三方或者你单独开发的用在多个父项目的库 。
6
+ 现在问题来了:你想要把它们看作两个项目独立的项目 ,还想要在一个中使用另一个。
7
7
8
8
这有一个例子。
9
9
假设你正在开发一个网站然后创建了 Atom 订阅。
@@ -52,7 +52,7 @@ Changes to be committed:
52
52
----
53
53
54
54
首先应当注意到新的 `.gitmodules` 文件。
55
- 这是一个配置文件保存项目的 URL 与已经将其拉入的本地目录之间的映射:
55
+ 这个配置文件保存了项目 URL 与已经将其拉入的本地目录之间的映射:
56
56
57
57
[source,console]
58
58
----
@@ -69,7 +69,7 @@ $ cat .gitmodules
69
69
70
70
[NOTE]
71
71
=====
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` 在本地覆盖这个选项。
73
73
=====
74
74
75
75
在 `git status` 输出中列出的另一个是项目文件夹记录。
@@ -195,11 +195,11 @@ Submodule path 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b2
195
195
196
196
==== 在有子模块的项目上工作
197
197
198
- 现在我们有一份子模块在其中的项目拷贝 ,我们将会同时在主项目与子模块项目上与队员协作。
198
+ 现在我们有一份含有子模块的项目拷贝 ,我们将会同时在主项目与子模块项目上与队员协作。
199
199
200
200
===== 拉入上游修改
201
201
202
- 在项目中使用子模块最简单的模型是只会消费子项目并想要不定期地获得更新 ,但是在你的检出中却不更改任何信息。
202
+ 在项目中使用子模块最简单的模型是只会使用子项目并想要不定期地获得更新 ,但是在你的检出中却不更改任何信息。
203
203
204
204
如果想要在子模块中查看新工作,可以进入到目录中并运行 `git fetch` 与 `git merge` 上游分支来更新本地代码。
205
205
@@ -216,7 +216,7 @@ Fast-forward
216
216
2 files changed, 2 insertions(+)
217
217
----
218
218
219
- 现在如果返回到主项目并运行 `git diff --submodule` 会看到子模块被更新了与获得了哪些提交添加进来的列表 。如果不想要在每次运行 `git diff` 时输入类型 `--submodle`,你可以通过设置 `diff.submodule` 选项为 ``log'' 将其作为默认行为。
219
+ 现在如果返回到主项目并运行 `git diff --submodule` 会看到子模块被更新了并获得了一个包含新添加提交的列表 。如果不想要在每次运行 `git diff` 时输入类型 `--submodle`,你可以通过设置 `diff.submodule` 选项为 ``log'' 将其作为默认行为。
220
220
221
221
[source,console]
222
222
----
@@ -227,9 +227,9 @@ Submodule DbConnector c3f01dc..d0354fc:
227
227
> better connection routine
228
228
----
229
229
230
- 如果这时候提交那么你会将子模块锁定为其他人更新时的新代码 。
230
+ 如果在此时提交,那么你会将子模块锁定为其他人更新时的新代码 。
231
231
232
- 如果不想要手动地在子目录中抓取与合并,也有一种轻松的方式可以这样做。如果运行 `git submodule update --remote`,Git 将会进入子模块然后抓取并更新。
232
+ 如果不想要手动地在子目录中抓取与合并,也有一种轻松的方式可以这样做。运行 `git submodule update --remote`,Git 将会进入子模块然后抓取并更新。
233
233
234
234
[source,console]
235
235
----
@@ -259,9 +259,9 @@ From https://github.com/chaconinc/DbConnector
259
259
Submodule path 'DbConnector': checked out 'c87d55d4c6d4b05ee34fbc8cb6f7bf4585ae6687'
260
260
----
261
261
262
- 如果不用 `-f .gitmodules` 选项那么它只会为你做修改,但是在仓库中保留跟踪信息更有意义一些因为其他人也可以这样做 。
262
+ 如果不用 `-f .gitmodules` 选项那么它只会为你做修改,但是在仓库中保留跟踪信息更有意义一些因为其他人也可以得到同样的效果 。
263
263
264
- 当我们在这时候运行 `git status`,Git 会显示我们在子模块中有 ``新提交''。
264
+ 这时我们运行 `git status`,Git 会显示我们在子模块中有 ``新提交''。
265
265
266
266
[source,console]
267
267
----
@@ -302,7 +302,7 @@ Submodules changed but not updated:
302
302
> catch non-null terminated lines
303
303
----
304
304
305
- 在这时候如果运行 `git diff` 可以同时看到我们修改了 ` .gitmodules` 文件,也有几个提取下来的提交准备提交到子模块项目中 。
305
+ 在这时候如果运行 `git diff` 既可以看到我们修改了 .gitmodules 文件,也可以看到有几个准备提交到子模块项目中的几个提取下来的提交 。
306
306
307
307
[source,console]
308
308
----
@@ -323,7 +323,7 @@ index 6fc0b3d..fd1cc29 100644
323
323
> better connection routine
324
324
----
325
325
326
- 这非常酷因为可以真实地看到将要提交到子模块中的提交的日志。一旦提交 ,也可以通过运行 `git log -p` 看到这个信息。
326
+ 这非常酷因为可以真实地看到将要提交到子模块中的提交的日志。提交之后 ,也可以通过运行 `git log -p` 看到这个信息。
327
327
328
328
[source,console]
329
329
----
@@ -358,9 +358,9 @@ Submodule DbConnector c3f01dc..c87d55d:
358
358
359
359
所以现在我们将通过一个例子演示同时在子模块与主项目中做修改,并且同时提交与发布那些修改。
360
360
361
- 到目前为止,当我们运行 `git submodule update` 从子模块仓库中抓取修改时,Git 将会获得这些改动并更新子目录中的文件,但是会将子仓库留在一个称作 ``脱离的 HEAD'' 的状态。这意味着没有本地工作分支(例如 ``master'')跟踪改动。所以任何你做的改动都不会被跟踪 。
361
+ 到目前为止,当我们运行 `git submodule update` 从子模块仓库中抓取修改时,Git 将会获得这些改动并更新子目录中的文件,但是会将子仓库留在一个称作 ``脱离的 HEAD'' 的状态。这意味着没有本地工作分支(例如 ``master'')跟踪改动。所以你做的任何改动都不会被跟踪 。
362
362
363
- 为了将子模块设置地更轻松地进入与工作,你需要做两件事。需要进入每一个子模块然后检出一个工作的分支。如果你做了改动你需要告诉怎么做然后 `git submodule update --remote` 拉入上游的新工作。选项是你可以合并它们到你的本地工作,或者你可以尝试变基你的工作到新的改动之上。
363
+ 为了将子模块设置地更轻松地进入与工作,你需要做两件事。需要进入每一个子模块然后检出一个工作的分支。如果你做了改动你要告诉 Git 让它做什么,然后 `git submodule update --remote` 拉入上游的新工作。选项是你可以合并它们到你的本地工作,或者你可以尝试变基你的工作到新的改动之上。
364
364
365
365
首先,让我们进入子模块目录然后检出一个分支。
366
366
@@ -370,7 +370,7 @@ $ git checkout stable
370
370
Switched to branch 'stable'
371
371
----
372
372
373
- 让我们尝试用 ``merge'' 选项。为了手工指定它,我们可以仅仅添加 `--merge` 选项给 `update` 调用 。这里我们将会看到在服务器上的这个子模块有一个改动并且它被合并了进来。
373
+ 让我们尝试用 ``merge'' 选项。为了手工指定它,我们可以仅仅给 `update` 添加 `--merge` 选项 。这里我们将会看到在服务器上的这个子模块有一个改动并且它被合并了进来。
374
374
375
375
[source,console]
376
376
----
@@ -388,7 +388,7 @@ Fast-forward
388
388
Submodule path 'DbConnector': merged in '92c7337b30ef9e0893e758dac2459d07362ab5ea'
389
389
----
390
390
391
- 如果我们进入 DbConnector 目录,可以发现新的改动已经合并入本地 `stable` 分支。现在让我们看看对库做一些我们自己本地的改动而同时其他人推送另外一个修改到上游时会发生什么 。
391
+ 如果我们进入 DbConnector 目录,可以发现新的改动已经合并入本地 `stable` 分支。现在让我们看看当我们对库做一些本地的改动而同时其他人推送另外一个修改到上游时会发生什么 。
392
392
393
393
[source,console]
394
394
----
@@ -419,7 +419,7 @@ Submodule path 'DbConnector': checked out '5d60ef9bbebf5a0c1c1050f242ceeb54ad58d
419
419
420
420
如果这发生了,不要担心,你可以简单地回到目录中再次检出你的分支(还包含着你的工作的分支)然后手动地合并或变基 `origin/stable` (或任何一个你想要的远程分支)。
421
421
422
- 在子模块中如果没有提交你的改动那么运行一个子模块更新将会出现问题 ,Git 会抓取改动但是不会覆盖子模块目录中未保存的工作。
422
+ 如果你没有提交子模块的改动,那么运行一个子模块更新将会出现问题 ,Git 会抓取改动但是不会覆盖子模块目录中未保存的工作。
423
423
424
424
[source,console]
425
425
----
@@ -454,7 +454,7 @@ Unable to merge 'c75e92a2b3855c9e5b66f915308390d9db204aca' in submodule path 'Db
454
454
[[_publishing_submodules]]
455
455
===== 发布子模块改动
456
456
457
- 现在在我们的子模块目录里有一些改动。其中有一些是我们通过更新从上游引入的而另一些是本地生成的,因为我们还没有推送它们所以对任何其他人都不可用 。
457
+ 现在在我们的子模块目录里有一些改动。其中有一些是我们通过更新从上游引入的而另一些是本地生成的,因为我们还没有推送所以它们对任何其他人都不可用 。
458
458
459
459
[source,console]
460
460
----
@@ -469,7 +469,7 @@ Submodule DbConnector c87d55d..82d2ad3:
469
469
470
470
如果我们在主项目中提交并推送但并不推送子模块上的改动,其他尝试检出我们修改的人会遇到麻烦,因为他们无法得到依赖的子模块改动。那些改动只存在于我们本地的拷贝中。
471
471
472
- 为了确保这不会发生,你可以让 Git 在推送到主项目前检查所有子模块是否已推送。`git push` 命令接受可以设置为 ``check'' 或 ``on-demand'' 的 `--recurse-submodules` 参数。如果任何提交的子模块改动没有推送那么 ``check'' 选项会使 `push` 操作直接失败 。
472
+ 为了确保这不会发生,你可以让 Git 在推送到主项目前检查所有子模块是否已推送。`git push` 命令接受可以设置为 ``check'' 或 ``on-demand'' 的 `--recurse-submodules` 参数。如果任何提交的子模块改动没有推送那么 ``check'' 选项直接使 `push` 操作失败 。
473
473
474
474
[source,console]
475
475
----
@@ -491,7 +491,7 @@ to push them to a remote.
491
491
492
492
如你所见,它也给我们了关于接下来如何做的一些有用的建议。最简单的选项是进入每一个子模块中然后手动推送到远程仓库来确保它们是可以被外部访问到的,然后再次尝试这次推送。
493
493
494
- 另一个选项是使用 ``on-demand'' 值,将会为你尝试这样做 。
494
+ 另一个选项是使用 ``on-demand'' 值,它会尝试为你这样做 。
495
495
496
496
[source,console]
497
497
----
@@ -605,7 +605,7 @@ $ git commit -m "Merge Tom's Changes" <5>
605
605
<4> 解决冲突的子模块记录
606
606
<5> 提交我们的合并
607
607
608
- 它可能有一点困惑 ,但是它真的不是特别难。
608
+ 这可能令你有些困惑 ,但是它真的不是特别难。
609
609
610
610
有意思的是,有另一个 Git 处理的例子。
611
611
如果在子模块目录中存在着一个包含在历史中的 **两边** 提交的合并提交,Git 会向你建议它为一个可行的解决方案。它看到在子模块项目的某一点,有人合并了包含有这两次提交的分支,所以你可能想要那个。
@@ -631,7 +631,7 @@ CONFLICT (submodule): Merge conflict in DbConnector
631
631
Automatic merge failed; fix conflicts and then commit the result.
632
632
----
633
633
634
- 它建议你做的是更新索引就像你运行了 `git add` 一样,将会清除冲突 ,然后提交。然而你可能不应该这样做。你可以轻松地进入子模块目录,查看差异是什么,快进到这次提交,恰当地测试,然后提交它。
634
+ 它建议你做的是更新索引就像你运行了 `git add` 一样,这将会清除冲突 ,然后提交。然而你可能不应该这样做。你可以轻松地进入子模块目录,查看差异是什么,快进到这次提交,恰当地测试,然后提交它。
635
635
636
636
[source,console]
637
637
----
@@ -645,7 +645,7 @@ $ git add DbConnector
645
645
$ git commit -am 'Fast forwarded to a common submodule child'
646
646
----
647
647
648
- 这完成了同一件事,但是最少这种方式你可以验证是否有效,当完成时在子模块目录中有你的代码 。
648
+ 这完成了同一件事,但是通过这种方式你至少可以验证工作是否有效,以及确保当完成时在子模块目录中有你的代码 。
649
649
650
650
651
651
==== 子模块技巧
@@ -654,7 +654,7 @@ $ git commit -am 'Fast forwarded to a common submodule child'
654
654
655
655
===== 子模块遍历
656
656
657
- 有一个 `foreach` 子模块命令可以在每一个子模块运行任意命令。如果你有很多子模块在同一个项目内这真的很有帮助 。
657
+ 有一个 `foreach` 子模块命令可以在每一个子模块运行任意命令。如果项目包含大量子模块这会很有用 。
658
658
659
659
例如,假设我们想要开始一个新功能或做一个错误修复并且我们在几个子模块中工作。我们可以轻松地在所有的子模块中储藏所有的工作。
660
660
@@ -721,7 +721,7 @@ index 1aaefb6..5297645 100644
721
721
722
722
===== 有用的别名
723
723
724
- 你可能想要为这些命令中的一些设置一些别名 ,因为它们可能会非常长而你又不能设置选项作为它们的默认选项。我们在 [[_git_aliases]] 介绍了设置 Git 别名,但是如果你计划在 Git 中大量使用子模块的话这里有一些可能想要设置的别名的例子。
724
+ 你可能想为其中一些命令设置别名 ,因为它们可能会非常长而你又不能设置选项作为它们的默认选项。我们在 [[_git_aliases]] 介绍了设置 Git 别名,但是如果你计划在 Git 中大量使用子模块的话这里有一些可能想要设置的别名的例子。
725
725
726
726
[source,console]
727
727
----
@@ -734,7 +734,7 @@ $ git config alias.supdate 'submodule update --remote --merge'
734
734
735
735
==== 子模块的问题
736
736
737
- 然而使用子模块并不是没有小问题 。
737
+ 然而使用子模块还是有一些小问题 。
738
738
739
739
例如在有子模块的项目中切换分支可能会麻烦。
740
740
如果你创建一个新分支,在那儿添加一个子模块,然后切换到没有那个子模块的分支时,你还会有一个未跟踪目录的子模块目录。
@@ -770,7 +770,7 @@ Untracked files:
770
770
nothing added to commit but untracked files present (use "git add" to track)
771
771
----
772
772
773
- 移除那个目录并不困难,但是有一个目录在那儿会让人有一点困惑。如果你移除它然后切换回有那个子模块的分支,需要运行 `submodule update --init` 来重新弹出它 。
773
+ 移除那个目录并不困难,但是有一个目录在那儿会让人有一点困惑。如果你移除它然后切换回有那个子模块的分支,需要运行 `submodule update --init` 来重新建立和填充 。
774
774
775
775
[source,console]
776
776
----
@@ -789,7 +789,7 @@ $ ls CryptoLibrary/
789
789
Makefile includes scripts src
790
790
----
791
791
792
- 再一次,并不是真的很困难 ,但是它会让人有一点困惑。
792
+ 这并不是真的很困难 ,但是它会让人有一点困惑。
793
793
794
794
另一个主要的警告是许多人遇到了从子目录转换为子模块的问题。
795
795
如果在你的项目中你已经跟踪了文件然后你想要将它们移动到一个子模块中,你必须非常小心否则 Git 会对你生气。
@@ -818,8 +818,8 @@ Unpacking objects: 100% (11/11), done.
818
818
Checking connectivity... done.
819
819
----
820
820
821
- 现在假设你在一个分支下做的那些 。
822
- 如果尝试切换回一个在实际树中那些文件还存在而不是子模块的分支 - 你会得到这个错误:
821
+ 现在假设你在一个分支下做了这样的工作 。
822
+ 如果尝试切换回的分支中那些文件还在子目录而非子模块中时 - 你会得到这个错误:
823
823
824
824
[source,console]
825
825
----
@@ -832,7 +832,7 @@ Please move or remove them before you can switch branches.
832
832
Aborting
833
833
----
834
834
835
- 你可以通过 `check -f` 来强制它切换,但是要小心如果你在那儿有未保存的修改因为通过那个命令它们会被覆盖掉 。
835
+ 你可以通过 `check -f` 来强制它切换,但是要小心如果你在那儿有未保存的修改这个命令会把它们覆盖掉 。
836
836
837
837
[source,console]
838
838
----
0 commit comments