04-Web技术-Maven+Git+Svn
第04章-WEB技术-Maven+Git+Svn
学习目标
Maven
Maven是什么
Maven是一个**项目管理**和**综合管理工具**。
Maven提供了开发人员构建一个完整的生命周期框架。
开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。
由于大部分项目的设置都很简单,并且可重复使用。
Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
Maven安装和配置
下载地址:
http://maven.apache.org/download.cgi
下载后:
解压后:
注:Maven 3.2要求JDK1.6或以上, Maven 3.0/3.1需要JDK1.5或以上
设置本地仓库存储
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
进入conf文件夹:
打开settings.xml文件:找到如下位置,设本地仓库的存储路径
设置中央仓库
当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载。
首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默认的 Maven 中央存储库(http://repo1.maven.org/maven2/ )查找下载。
当然这个重要仓库位于国外服务器,国内是连接不上的,所以需要配置国内的中央仓库地址。
设置阿里云的中央仓库:找到 settings.xml 文件中的 mirror 标签
1
2
3
4
5
6
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
Eclipse设置Maven




项目结构
创建好如下:
需要添加WEB-INF目录
完成后生成如下目录和文件
目录说明:
修改默认编译的JDK版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.6.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>utf-8encoding>
configuration>
plugin>
plugins>
build>
或者
直接修改Maven全局配置文件setting.xml文件
找到标记,并在里面添加如下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<profile>
<id>jdk-1.8id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<maven.compiler.encoding>utf-8</maven.compiler.encoding>
</properties>
</profile>
更新配置文件,并update 、Maven项目
Maven POM
POM代表项目对象模型。它是 Maven 中工作的基本单位,这是一个 XML 文件。它始终保存在该项目基本目录中的 pom.xml 文件。
POM 包含的项目是使用 Maven 来构建的,它用来包含各种配置信息。
POM 也包含了目标和插件。在执行任务或目标时,Maven 会使用当前目录中的 POM。它读取POM得到所需要的配置信息,然后执行目标。部分的配置可以在
创建一个POM之前,应该要先决定项目组(groupId),它的名字(artifactId)和版本,因为这些属性在项目仓库是唯一标识的。
1
2
3
4
5
6
7
8
9
10
11
12
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.companyname.project-groupgroupId>
<artifactId>projectartifactId>
<version>1.0version>
project>
每个项目只有一个POM文件。
所有的 POM 文件要项目元素必须有三个必填字段: groupId,artifactId,version
在库中的项目符号是:groupId:artifactId:version
pom.xml 的根元素是 project,它有三个主要的子节点。
| 节点 | 描述 |
|---|---|
| project | 工程的根标签。 |
| modelVersion | 模型版本需要设置为 4.0。 |
| groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。 |
| artifactId | 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 |
| version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如:com.company.bank:consumer-banking:1.0com.company.bank:consumer-banking:1.1 |
POM 依赖包
依赖包有多种范围,分别作用在不同场景
| 依赖范围 | 描述 |
|---|---|
| compile | 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的maven依赖,对于**编译 测试 运行**三种的classpath都有效 |
| provided | 以提供依赖范围。使用此依赖范围的maven依赖,对于**编译**和**测试**classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候,由于容器已经提供,就不需要maven重复地引入一遍。打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作 |
| runtime | 运行时依赖范围。使用此依赖范围的maven依赖,对于**测试**和**运行**classpath有效,**但在编译主代码时无效**。典型的例子是JDBC驱动实现,项目主代码的编译只需要jdk提供的jdbc的接口,只有在执行测试或者运行测试的时候才需要实现上述接口的jdbc的驱动 |
| system | 系统依赖范围。从参与度来说,和provided相同,不过被依赖项不**会从maven仓库下载**,而是从本地文件系统拿。需要添加systemPath的属性来定义路径,该依赖与三种范围的classpath和provided依赖范围完全一致。可能造成不可移植,谨慎使用 |
| import | import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。只有在dependencyManagement下才有效果 |
| test | 测试依赖范围。使用此依赖范围的Maven依赖,只对于测试的classpath有效,在编译主代码或者运行主代码的时候都无法依赖此类依赖。典型的例子是jUnit,它只有在编译测试代码及运行测试代码的时候才有效 |
常用依赖包 Servlet4.0
1
2
3
4
5
6
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.0version>
<scope>providedscope>
dependency>
Maven 构建生命周期
Maven 构建生命周期定义了一个项目构建跟发布的过程。
一个典型的 Maven 构建(build)生命周期主要由以下几个阶段的序列组成的:
| 阶段 | 处理 | 描述 |
|---|---|---|
| 验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
| 编译 compile | 执行编译 | 源代码编译在此阶段完成 |
| 测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
| 包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
| 检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
| 安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
| 部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
详细生命周期说明
| 生命周期阶段 | 描述 |
|---|---|
| validate(校验) | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
| initialize(初始化) | 初始化构建状态,比如设置属性值。 |
| generate-sources(生成源代码) | 生成包含在编译阶段中的任何源代码。 |
| process-sources(处理源代码) | 处理源代码,比如说,过滤任意值。 |
| generate-resources(生成资源文件) | 生成将会包含在项目包中的资源文件。 |
| process-resources (处理资源文件) | 复制和处理资源到目标目录,为打包阶段最好准备。 |
| compile(编译) | 编译项目的源代码。 |
| process-classes(处理类文件) | 处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
| generate-test-sources(生成测试源代码) | 生成包含在编译阶段中的任何测试源代码。 |
| process-test-sources(处理测试源代码) | 处理测试源代码,比如说,过滤任意值。 |
| generate-test-resources(生成测试资源文件) | 为测试创建资源文件。 |
| process-test-resources(处理测试资源文件) | 复制和处理测试资源到目标目录。 |
| test-compile(编译测试源码) | 编译测试源代码到测试目标目录. |
| process-test-classes(处理测试类文件) | 处理测试源码编译生成的文件。 |
| test(测试) | 使用合适的单元测试框架运行测试(Juint是其中之一)。 |
| prepare-package(准备打包) | 在实际打包之前,执行任何的必要的操作为打包做准备。 |
| package(打包) | 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
| pre-integration-test(集成测试前) | 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
| integration-test(集成测试) | 处理和部署项目到可以运行集成测试环境中。 |
| post-integration-test(集成测试后) | 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
| verify (验证) | 运行任意的检查来验证项目包有效且达到质量标准。 |
| install(安装) | 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
| deploy(部署) | 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。
Maven 常用命令
- mvn compile
- 编译源代码
-
mvn test-compile
- 编译测试代码:
-
mvn package
- 此命令包含一系列过程:validate–>compile–>test–>package
- Maven根据pom文件里packaging的配置,决定是生成jar文件还是war文件,并放到target目录下。
- 此命令需要在项目的根目录(也就是pom.xml文件所在的目录)下运行,Maven才知道打包哪个项目。
-
mvn clean
- 每次更新项目的内容,Maven是不会自动编译更新的,所以target目录下的内容是缓存的,每次部署前都需要把最新数据更新到target目录下。
- 当运行mvn clean后,target下的内容都会被删除,然后生成最新的数据。
- 如果要把项目部署到生产环境,强烈建议用mvn clean package命令,确保部署的是最新的内容。
-
mvn test
- 该命令执行后会去运行所有的单元测试,如果想要单独运行某个测试类里的单元测试,可用如下命令:mvn -Dtest=TestApp1 test
-
mvn clean install
- 该命令会把你的项目打包并放到本地仓库,别人就可以引用了。
- 此命令包含以下过程:validate–>compile–>test–>package–>integration-test–>verify–>install。
-
mvn site
- 该命令会为你的项目生产一个文档站点,介绍你的项目,存储位置为target/site,该命令可能只有开源项目有用吧,毕竟平常没人会去关注你的项目信息。
-
mvn site:deploy
- 该命令会把文档站点部署到服务器。
-
mvn tomcatX:run
- 通过tomcat部署插件运行项目
-
mvn tomcatX:deploy
- 通过tomcat部署插件把项目部署到服务器。
-
部署到服务器(X:版本)
- mvn tomcatX:deploy –部署项目
- mvn tomcatX:redeploy –重新部署项目
- mvn tomcatX:undeploy –撤销已经部署的项目
配置Maven插件
SSM 常用 jar 包
JavaEE所需要的jar包
1
2
3
4
5
<dependency>
<groupId>javaxgroupId>
<artifactId>javaee-apiartifactId>
<version>7.0version>
dependency>
Spring所需要的jar包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>${spring.version}version>
dependency>
SpringMVC所需要的jar包
1
2
3
4
5
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
Mybatis所需要的jar包
1
2
3
4
5
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>${mybatis.version}version>
dependency>
Mybatis与Spring整合所需要的jar包
1
2
3
4
5
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>1.3.1version>
dependency>
数据库连接所需要的jar包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.19version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
其他jar包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
POM 标签大全详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId />
<groupId />
<version />
<relativePath />
parent>
<modelVersion>4.0.0modelVersion>
<groupId>asia.banseongroupId>
<artifactId>banseon-maven2artifactId>
<packaging>jarpackaging>
<version>1.0-SNAPSHOTversion>
<name>banseon-mavenname>
<url>http://www.baidu.com/banseonurl>
<description>A maven project to study maven.description>
<prerequisites>
<maven />
prerequisites>
<issueManagement>
<system>jirasystem>
<url>http://jira.baidu.com/banseonurl>
issueManagement>
<ciManagement>
<system />
<url />
<notifiers>
<notifier>
<type />
<sendOnError />
<sendOnFailure />
<sendOnSuccess />
<sendOnWarning />
<address />
<configuration />
notifier>
notifiers>
ciManagement>
<inceptionYear />
<mailingLists>
<mailingList>
<name>Demoname>
<post>banseon@126.compost>
<subscribe>banseon@126.comsubscribe>
<unsubscribe>banseon@126.comunsubscribe>
<archive>http:/hi.baidu.com/banseon/demo/dev/archive>
mailingList>
mailingLists>
<developers>
<developer>
<id>HELLO WORLDid>
<name>banseonname>
<email>banseon@126.comemail>
<url />
<roles>
<role>Project Managerrole>
<role>Architectrole>
roles>
<organization>demoorganization>
<organizationUrl>http://hi.baidu.com/banseonorganizationUrl>
<properties>
<dept>Nodept>
properties>
<timezone>-5timezone>
developer>
developers>
<contributors>
<contributor>
<name />
<email />
<url />
<organization />
<organizationUrl />
<roles />
<timezone />
<properties />
contributor>
contributors>
<licenses>
<license>
<name>Apache 2name>
<url>http://www.baidu.com/banseon/LICENSE-2.0.txturl>
<distribution>repodistribution>
<comments>A business-friendly OSS licensecomments>
license>
licenses>
<scm>
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
connection>
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
developerConnection>
<tag />
<url>http://svn.baidu.com/banseonurl>
scm>
<organization>
<name>demoname>
<url>http://www.baidu.com/banseonurl>
organization>
<build>
<sourceDirectory />
<scriptSourceDirectory />
<testSourceDirectory />
<outputDirectory />
<testOutputDirectory />
<extensions>
<extension>
<groupId />
<artifactId />
<version />
extension>
extensions>
<defaultGoal />
<resources>
<resource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
resource>
resources>
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
testResource>
testResources>
<directory />
<finalName />
<filters />
<pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<inherited />
<configuration />
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
build>
<profiles>
<profile>
<id />
<activation>
<activeByDefault />
<jdk />
<os>
<name>Windows XPname>
<family>Windowsfamily>
<arch>x86arch>
<version>5.1.2600version>
os>
<property>
<name>mavenVersionname>
<value>2.0.3value>
property>
<file>
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
exists>
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
missing>
file>
activation>
<build>
<defaultGoal />
<resources>
<resource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
resource>
resources>
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
testResource>
testResources>
<directory />
<finalName />
<filters />
<pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
build>
<modules />
<repositories>
<repository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id />
<name />
<url />
<layout />
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id />
<name />
<url />
<layout />
pluginRepository>
pluginRepositories>
<dependencies>
<dependency>
......
dependency>
dependencies>
<reports />
<reporting>
......
reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
dependency>
dependencies>
dependencyManagement>
<distributionManagement>
......
distributionManagement>
<properties />
profile>
profiles>
<modules />
<repositories>
<repository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id>banseon-repository-proxyid>
<name>banseon-repository-proxyname>
<url>http://192.168.1.169:9999/repository/url>
<layout>defaultlayout>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
......
pluginRepository>
pluginRepositories>
<span class="hljs-comment"><!--该元素描述了项目相关的所有依赖。
这些依赖组成了项目构建过程中的一个个环节。
它们自动从项目定义的仓库中下载。
要获取更多信息,请看项目依赖机制。 --></span>
<span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-title">dependency</span>></span>
<span class="hljs-comment"><!--依赖的group ID --></span>
<span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.apache.maven<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span>
<span class="hljs-comment"><!--依赖的artifact ID --></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>maven-artifact<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span>
<span class="hljs-comment"><!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 --></span>
<span class="hljs-tag"><<span class="hljs-title">version</span>></span>3.8.1<span class="hljs-tag"></<span class="hljs-title">version</span>></span>
<span class="hljs-comment"><!--依赖类型,默认类型是jar。
它通常表示依赖的文件的扩展名,但也有例外。
一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,
尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。
如果设置extensions为 true,就可以在 plugin里定义新的类型。
所以前面的类型的例子不完整。 --></span>
<span class="hljs-tag"><<span class="hljs-title">type</span>></span>jar<span class="hljs-tag"></<span class="hljs-title">type</span>></span>
<span class="hljs-comment"><!--依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。
分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成
JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,
你就可以使用分类器来生成两个单独的JAR构件。 --></span>
<span class="hljs-tag"><<span class="hljs-title">classifier</span>></span><span class="hljs-tag"></<span class="hljs-title">classifier</span>></span>
<span class="hljs-comment"><!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。
欲知详情请参考依赖机制。
- compile :默认范围,用于编译
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时需要使用
- test: 用于test任务时使用
- system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 --></span>
<span class="hljs-tag"><<span class="hljs-title">scope</span>></span>test<span class="hljs-tag"></<span class="hljs-title">scope</span>></span>
<span class="hljs-comment"><!--仅供system范围使用。
注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。
该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。
推荐使用属性匹配绝对路径,例如${java.home}。 --></span>
<span class="hljs-tag"><<span class="hljs-title">systemPath</span>></span><span class="hljs-tag"></<span class="hljs-title">systemPath</span>></span>
<span class="hljs-comment"><!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。
即告诉maven你只依赖指定的项目,不依赖项目的依赖。
此元素主要用于解决版本冲突问题 --></span>
<span class="hljs-tag"><<span class="hljs-title">exclusions</span>></span>
<span class="hljs-tag"><<span class="hljs-title">exclusion</span>></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-core<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span>
<span class="hljs-tag"></<span class="hljs-title">exclusion</span>></span>
<span class="hljs-tag"></<span class="hljs-title">exclusions</span>></span>
<span class="hljs-comment"><!--可选依赖,如果你在项目B中把C依赖声明为可选,
你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。
可选依赖阻断依赖的传递性。 --></span>
<span class="hljs-tag"><<span class="hljs-title">optional</span>></span>true<span class="hljs-tag"></<span class="hljs-title">optional</span>></span>
<span class="hljs-tag"></<span class="hljs-title">dependency</span>></span>
<span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span>
<span class="hljs-comment"><!--不赞成使用. 现在Maven忽略该元素. --></span>
<span class="hljs-tag"><<span class="hljs-title">reports</span>></span><span class="hljs-tag"></<span class="hljs-title">reports</span>></span>
<span class="hljs-comment"><!--该元素描述使用报表插件产生报表的规范。
当用户执行"mvn site",这些报表就会运行。
在页面导航栏能看到所有报表的链接。 --></span>
<span class="hljs-tag"><<span class="hljs-title">reporting</span>></span>
<span class="hljs-comment"><!--true,则,网站不包括默认的报表。
这包括"项目信息"菜单中的报表。 --></span>
<span class="hljs-tag"><<span class="hljs-title">excludeDefaults</span> /></span>
<span class="hljs-comment"><!--所有产生的报表存放到哪里。
默认值是${project.build.directory}/site。 --></span>
<span class="hljs-tag"><<span class="hljs-title">outputDirectory</span> /></span>
<span class="hljs-comment"><!--使用的报表插件和他们的配置。 --></span>
<span class="hljs-tag"><<span class="hljs-title">plugins</span>></span>
<span class="hljs-comment"><!--plugin元素包含描述报表插件需要的信息 --></span>
<span class="hljs-tag"><<span class="hljs-title">plugin</span>></span>
<span class="hljs-comment"><!--报表插件在仓库里的group ID --></span>
<span class="hljs-tag"><<span class="hljs-title">groupId</span> /></span>
<span class="hljs-comment"><!--报表插件在仓库里的artifact ID --></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span> /></span>
<span class="hljs-comment"><!--被使用的报表插件的版本(或版本范围) --></span>
<span class="hljs-tag"><<span class="hljs-title">version</span> /></span>
<span class="hljs-comment"><!--任何配置是否被传播到子项目 --></span>
<span class="hljs-tag"><<span class="hljs-title">inherited</span> /></span>
<span class="hljs-comment"><!--报表插件的配置 --></span>
<span class="hljs-tag"><<span class="hljs-title">configuration</span> /></span>
<span class="hljs-comment"><!--一组报表的多重规范,每个规范可能有不同的配置。
一个规范(报表集)对应一个执行目标 。
例如,
有1,2,3,4,5,6,7,8,9个报表。
1,2,5构成A报表集,对应一个执行目标。
2,5,8构成B报表集,对应另一个执行目标 --></span>
<span class="hljs-tag"><<span class="hljs-title">reportSets</span>></span>
<span class="hljs-comment"><!--表示报表的一个集合,以及产生该集合的配置 --></span>
<span class="hljs-tag"><<span class="hljs-title">reportSet</span>></span>
<span class="hljs-comment"><!--报表集合的唯一标识符,POM继承时用到 --></span>
<span class="hljs-tag"><<span class="hljs-title">id</span> /></span>
<span class="hljs-comment"><!--产生报表集合时,被使用的报表的配置 --></span>
<span class="hljs-tag"><<span class="hljs-title">configuration</span> /></span>
<span class="hljs-comment"><!--配置是否被继承到子POMs --></span>
<span class="hljs-tag"><<span class="hljs-title">inherited</span> /></span>
<span class="hljs-comment"><!--这个集合里使用到哪些报表 --></span>
<span class="hljs-tag"><<span class="hljs-title">reports</span> /></span>
<span class="hljs-tag"></<span class="hljs-title">reportSet</span>></span>
<span class="hljs-tag"></<span class="hljs-title">reportSets</span>></span>
<span class="hljs-tag"></<span class="hljs-title">plugin</span>></span>
<span class="hljs-tag"></<span class="hljs-title">plugins</span>></span>
<span class="hljs-tag"></<span class="hljs-title">reporting</span>></span>
<span class="hljs-comment"><!--继承自该项目的所有子项目的默认依赖信息。
这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖
(必须描述group ID和 artifact ID信息),
如果group ID和artifact ID以外的一些信息没有描述,
则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。 --></span>
<span class="hljs-tag"><<span class="hljs-title">dependencyManagement</span>></span>
<span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span>
<span class="hljs-comment"><!--参见dependencies/dependency元素 --></span>
<span class="hljs-tag"><<span class="hljs-title">dependency</span>></span>
......
<span class="hljs-tag"></<span class="hljs-title">dependency</span>></span>
<span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span>
<span class="hljs-tag"></<span class="hljs-title">dependencyManagement</span>></span>
<span class="hljs-comment"><!--项目分发信息,在执行mvn deploy后表示要发布的位置。
有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 --></span>
<span class="hljs-tag"><<span class="hljs-title">distributionManagement</span>></span>
<span class="hljs-comment"><!--部署项目产生的构件到远程仓库需要的信息 --></span>
<span class="hljs-tag"><<span class="hljs-title">repository</span>></span>
<span class="hljs-comment"><!--是分配给快照一个唯一的版本号(由时间戳和构建流水号)?
还是每次都使用相同的版本号?参见repositories/repository元素 --></span>
<span class="hljs-tag"><<span class="hljs-title">uniqueVersion</span> /></span>
<span class="hljs-tag"><<span class="hljs-title">id</span>></span>banseon-maven2<span class="hljs-tag"></<span class="hljs-title">id</span>></span>
<span class="hljs-tag"><<span class="hljs-title">name</span>></span>banseon maven2<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url</span>></span>file://${basedir}/target/deploy<span class="hljs-tag"></<span class="hljs-title">url</span>></span>
<span class="hljs-tag"><<span class="hljs-title">layout</span> /></span>
<span class="hljs-tag"></<span class="hljs-title">repository</span>></span>
<span class="hljs-comment"><!--构件的快照部署到哪里?如果没有配置该元素,
默认部署到repository元素配置的仓库,
参见distributionManagement/repository元素 --></span>
<span class="hljs-tag"><<span class="hljs-title">snapshotRepository</span>></span>
<span class="hljs-tag"><<span class="hljs-title">uniqueVersion</span> /></span>
<span class="hljs-tag"><<span class="hljs-title">id</span>></span>banseon-maven2<span class="hljs-tag"></<span class="hljs-title">id</span>></span>
<span class="hljs-tag"><<span class="hljs-title">name</span>></span>Banseon-maven2 Snapshot Repository<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url</span>></span>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot<span class="hljs-tag"></<span class="hljs-title">url</span>></span>
<span class="hljs-tag"><<span class="hljs-title">layout</span> /></span>
<span class="hljs-tag"></<span class="hljs-title">snapshotRepository</span>></span>
<span class="hljs-comment"><!--部署项目的网站需要的信息 --></span>
<span class="hljs-tag"><<span class="hljs-title">site</span>></span>
<span class="hljs-comment"><!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 --></span>
<span class="hljs-tag"><<span class="hljs-title">id</span>></span>banseon-site<span class="hljs-tag"></<span class="hljs-title">id</span>></span>
<span class="hljs-comment"><!--部署位置的名称 --></span>
<span class="hljs-tag"><<span class="hljs-title">name</span>></span>business api website<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
<span class="hljs-comment"><!--部署位置的URL,按protocol://hostname/path形式 --></span>
<span class="hljs-tag"><<span class="hljs-title">url</span>></span>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
<span class="hljs-tag"></<span class="hljs-title">url</span>></span>
<span class="hljs-tag"></<span class="hljs-title">site</span>></span>
<span class="hljs-comment"><!--项目下载页面的URL。如果没有该元素,用户应该参考主页。
使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 --></span>
<span class="hljs-tag"><<span class="hljs-title">downloadUrl</span> /></span>
<span class="hljs-comment"><!--如果构件有了新的group ID和artifact ID(构件移到了新的位置),
这里列出构件的重定位信息。 --></span>
<span class="hljs-tag"><<span class="hljs-title">relocation</span>></span>
<span class="hljs-comment"><!--构件新的group ID --></span>
<span class="hljs-tag"><<span class="hljs-title">groupId</span> /></span>
<span class="hljs-comment"><!--构件新的artifact ID --></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span> /></span>
<span class="hljs-comment"><!--构件新的版本号 --></span>
<span class="hljs-tag"><<span class="hljs-title">version</span> /></span>
<span class="hljs-comment"><!--显示给用户的,关于移动的额外信息,例如原因。 --></span>
<span class="hljs-tag"><<span class="hljs-title">message</span> /></span>
<span class="hljs-tag"></<span class="hljs-title">relocation</span>></span>
<span class="hljs-comment"><!-- 给出该构件在远程仓库的状态。
不得在本地项目中设置该元素,因为这是工具自动更新的。
有效的值有:
none(默认),
converted(仓库管理员从Maven 1 POM转换过来),
partner(直接从伙伴Maven 2仓库同步过来),
deployed(从Maven 2实例部 署),
verified(被核实时正确的和最终的)。 --></span>
<span class="hljs-tag"><<span class="hljs-title">status</span> /></span>
<span class="hljs-tag"></<span class="hljs-title">distributionManagement</span>></span>
<span class="hljs-comment"><!--以值替代名称,Properties可以在整个POM中使用,
也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。
格式是<name>value</name>。 --></span>
<span class="hljs-tag"><<span class="hljs-title">properties</span> /></span>
</project>
GIT
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
下载GIT
下载地址:
或者:
根据你的电脑系统选择下载版本
安装GIT
一直下一步
远程仓库
可选GitHub【https://github.com/】或者oschina【https://gitee.com/】
以oschina为例
注册账号,登陆账号
创建新仓库:
填写仓库内容:
GIT 工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

GIT 底层原理
Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

- 图中左侧为工作区,右侧为版本库。在版本库中标记为 “
index” 的区域是暂存区(stage/index),标记为 “master” 的是master分支所代表的目录树。 - 图中我们可以看出此时 “
HEAD” 实际是指向master分支的一个“游标”。所以图示的命令中出现HEAD的地方可以用master来替换。 - 图中的
objects标识的区域为Git的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。 - 当对工作区修改(或新增)的文件执行
git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。 - 当执行提交操作(
git commit)时,暂存区的目录树写到版本库(对象库)中,master分支会做相应的更新。即master指向的目录树就是提交时暂存区的目录树。 - 当执行
git reset HEAD命令时,暂存区的目录树会被重写,被master分支指向的目录树所替换,但是工作区不受影响。 - 当执行
git rm --cached命令时,会直接从暂存区删除文件,工作区则不做出改变。 - 当执行 git checkout . 或者
git checkout --命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。 - 当执行
git checkout HEAD .或者git checkout HEAD命令时,会用HEAD指向的master分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
GIT 常用命令
git init 创建仓库
git init 命令用于在目录中创建新的 Git 仓库。
在目录中执行 git init 就可以创建一个 Git 仓库了。
执行命令后会在项目中生成了 .git 这个子目录,是隐藏的。
git init
git clone 克隆项目
git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。
git clone [url] [project-name]
url 是你要拷贝的项目。
project-name 是自定义项目名称。
如:
git clone https://github.com/tianqixin/test projectTest
git add 添加文件
git add 命令可将该文件添加到暂存区。
1
2
3
4
5
6
7
8
# 添加一个或多个文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录:
git add [dir]
# 添加当前目录下的所有文件到暂存区:
git add .
git status 命令用于查看在上次提交之后,是否对文件进行再次修改。
- 使用 -s 参数来获得简短的输出结果
git status [-s]
如:
1
2
3
git status -s
AM README
A hello.php
AM 状态的意思是:这个文件在添加到缓存之后又有改动。
git rm 删除文件
git rm 命令用于删除文件。
1
2
# 将文件从暂存区和工作区中删除:
git rm [file]
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。
1
2
# 强行从暂存区和工作区中删除修改后的文件
git rm -f [file]
如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,使用 –cached 选项
1
2
# 从暂存区域移除,保留在当前工作目录中
git rm --cached
git mv 移动重命名
git mv 命令用于移动或重命名一个文件、目录或软连接。如:项目中文件被重命名或者移动。
1
2
# 重命名
git mv [file] [newfile]
如果新但文件名已经存在,但还是要重命名它,可以使用 -f 参数:
1
2
# 强制重命名
git mv -f [file] [newfile]
git commit 提交到本地仓库
使用 git add 命令将内容写入暂存区后,再用 git commit 命令将暂存区内容添加到本地仓库中。
但是在提交之前,需要先设置提交的用户信息,包括用户名和邮箱:
1
2
git config --global user.name 'runoob'
git config --global user.email test@runoob.com
如果去掉 --global 参数只对当前仓库有效。
git commit [file1] [file2] ... -m [message]
-a 参数设置可以直接提交而不需要执行 git add 命令
$ git commit -a
git reset 回退版本
git reset 命令用于回退版本,可以指定退回某一次提交的版本。
git reset [ --soft | --mixed | --hard ] [HEAD]
–mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset [HEAD]
如:
1
2
3
git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
git reset 052e # 回退到指定版本
–soft 参数用于回退到某个版本:
git reset --soft HEAD
如:
git reset --soft HEAD~3 # 回退 上上上 一个版本
–hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
git reset --hard HEAD
如:
1
2
3
git reset -–hard HEAD~3 # 回退上上上一个版本
git reset -–hard bae128 # 回退到某个版本回退点之前的所有信息。
git reset --hard origin/master # 将本地的状态回退到和远程的一样
注意:谨慎使用 -–hard 参数,它会删除回退点之前的所有信息。
HEAD 说明:
- HEAD 表示当前版本
- HEAD^ 上一个版本
- HEAD^^ 上上一个版本
- HEAD^^^ 上上上一个版本
- 以此类推…
可以使用 ~数字表示
- HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD^2 上上一个版本
- HEAD^3 上上上一个版本
- 以此类推…
git diff 差异比较
git diff 命令比较文件的不同,即比较文件在暂存区和工作区的差异。
git diff 命令显示已写入暂存区和已经被修改但尚未写入暂存区文件对区别。
git diff 有两个主要的应用场景。
- 尚未缓存的改动:**git diff**
- 查看已缓存的改动: git diff –cached
- 查看已缓存的与未缓存的所有改动:**git diff HEAD**
- 显示摘要而非整个 diff:**git diff –stat**
显示暂存区和工作区的差异:
git diff [file]
显示暂存区和上一次提交(commit)的差异:
1 2 3git diff --cached [file] 或 git diff --staged [file]
显示两次提交之间的差异:
git diff [first-branch] ... [second-branch]
git remote 命令
git remote 命用于远程仓库操作。
(1)显示所有远程仓库
git remote -v
如:**origin** 为远程地址的别名。
1 2 3git remote -v origin https://github.com/tianqixin/runoob-git-test (fetch) origin https://github.com/tianqixin/runoob-git-test (push)
(2)显示某个远程仓库的信息
git remote show [remote]
例如:
1
2
3
4
5
6
7
git remote show https://github.com/tianqixin/runoob-git-test
* remote https://github.com/tianqixin/runoob-git-test
Fetch URL: https://github.com/tianqixin/runoob-git-test
Push URL: https://github.com/tianqixin/runoob-git-test
HEAD branch: master
Local ref configured for 'git push':
master pushes to master (local out of date)
(3)添加远程版本库:
git remote add [name] [url]
name 为远程仓库的名字:
git remote add origin git@github.com:tianqixin/run-git-test.git
(4)删除远程仓库
name 为远程仓库的名字:
1
2
# 删除远程仓库
git remote rm name
(5) 修改仓库名
git remote rename old_name new_name
git fetch 获取代码
git fetch 命令用于从远程获取代码库。
git fetch 该命令执行完后,需要执行 git merge 远程分支到本地所在的分支。
git fetch [alias]
git merge 从远端仓库提取数据并尝试合并到当前分支。
git merge [alias]/[branch]
如:
然后我们在本地更新修改。
1
2
3
4
5
6
7
$ git fetch origin
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:tianqixin/runoob-git-test
0205aab..febd8ed master -> origin/master
以上信息“0205aab..febd8ed master -> origin/master” 说明 master 分支已被更新,接下来可以使用以下命令将更新同步到本地:
1
2
3
4
5
$ git merge origin/master
Updating 0205aab..febd8ed
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)
git pull 命令
git pull 命令用于从远程获取代码并合并本地的版本。
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。 命令格式如下:
git pull <远程主机名> <远程分支名>:<本地分支名>
如:
1
2
3
4
5
6
7
8
9
10
# 更新操作:
git pull
git pull origin
# 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master:brantest
# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
# 取回 origin/master 分支,再与本地的 brantest 分支合并。
git pull origin master
git push 远程更新
git push 命用于从将本地的分支版本上传到远程并合并。
命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
如:
1
2
3
4
# 以下命令将本地的 master 分支推送到 origin 主机的 master 分支。
git push origin master
# 相等于
git push origin master:master
如果本地版本与远程版本有差异,但又要强制推送可以使用 –force 参数:
git push --force origin master
删除主机的分支可以使用 –delete 参数,以下命令表示删除 origin 主机的 master 分支:
git push origin --delete master
Git 分支管理
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
有人把 Git 的分支模型称为**必杀技特性**,而正是因为它,将 Git 从版本控制系统家族里区分出来。
列出分支基本命令:
git branch
没有参数时,**git branch** 会列出你在本地的分支。
1
2
$ git branch
* master
创建分支命令:
git branch (branchname)
切换分支命令:
git checkout (branchname)
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
创建新分支并立即切换到该分支下
git checkout -b (branchname)
合并分支命令:
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改
git merge
你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。
删除分支命令:
git branch -d (branchname)
SVN
Subversion(SVN) 是一个开源的版本控制系統。
SVN 概念
- repository(源代码库):源代码统一存放的地方
- Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
- Commit(提交):当你已经修改了代码,你就需要Commit到repository
- Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步
SVN 安装
1、准备svn的安装文件
下载地址:https://sourceforge.net/projects/win32svn/
下载完成后,在相应的盘符中会有一个Setup-Subversion-1.8.16.msi的文件,目前最新的版本是1.8.16, 这里就使用这个版本。然后双击安装文件进行安装。

把svn安装目录里的bin目录添加到path路径中,在命令行窗口中输入 svnserve --help ,查看安装正常与否。

至此,windows下的SVN安装完成。
SVN 启动模式
首先,在服务端进行SVN版本库的相关配置
手动新建版本库目录
mkdir /opt/svn
利用svn命令创建版本库
svnadmin create /opt/svn/runoob
使用命令svnserve启动服务
svnserve -d -r 目录 --listen-port 端口号
- -r: 配置方式决定了版本库访问方式。
- –listen-port: 指定SVN监听端口,不加此参数,
SVN默认监听3690
由于-r 配置方式的不一样,SVN启动就可以有两种不同的访问方式。
方式一:-r直接指定到版本库(称之为单库svnserve方式)
svnserve -d -r /opt/svn/runoob
在这种情况下,一个svnserve只能为一个版本库工作。
authz配置文件中对版本库权限的配置应这样写:
1
2
3
4
5
6
[groups]
admin=user1
dev=user2
[/]
@admin=rw
user2=r
使用类似这样的URL:svn://192.168.0.1/ 即可访问runoob版本库
方式二:指定到版本库的上级目录(称之为多库svnserve方式)
svnserve -d -r /opt/svn
这种情况,一个svnserve可以为多个版本库工作
authz配置文件中对版本库权限的配置应这样写:
1
2
3
4
5
6
7
8
9
10
[groups]
admin=user1
dev=user2
[runoob:/]
@admin=rw
user2=r
[runoob01:/]
@admin=rw
user2=r
如果此时你还用[/],则表示所有库的根目录,同理,[/src]表示所有库的根目录下的src目录。
使用类似这样的URL:svn://192.168.0.1/runoob 即可访问runoob版本库。
TortoiseSVN 客户端
TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。
安装
下载地址:https://tortoisesvn.net/downloads.html, 页面里有语言包补丁的下载链接。
目前最新版为 1.11.0 下载地址: https://osdn.net/projects/tortoisesvn/storage/1.11.0/

在语言补丁包中我们可以找到中文的补丁并下载下来:

运行下载的 TortoiseSVN 安装程序

运行下载的 TortoiseSVN 中文语言包

正确安装后,应该进行一次的重开机,以确保 TortoiseSVN 的正确无误。
修改 TortoiseSVN 默认语言
TortoiseSVN 安装完后默认的界面是英文的,我们可以通过设置修改成已安装语言

使用
建立工作目录
所谓的 runoob01 目录其实就是您平常用来存放工作档案的地方。通常我们会等到自己的工作做的一个段落的时候再进行备份。所以我们平常都是在 runoob01 目录下面工作,等到适当时机在 commit 到 repository 中。举例来说,我们想在 D 盘下面建立一个名为 runoob01 的目录。首先先把这个目录建立出来。

进入创建的目录在空白处按下右键后(您可以在 MyWork 目录的 icon 上按,也可进入 MyWork 目录后,在空白的地方按),选择 SVN checkout。

接着您可以看到如下的画面:

首先我们要填入的是 repository(版本库)的位置,对于 SVN 来说,repository 的位置都是 URL。版本库 URL 这里填入我们测试的版本仓库地址 svn://10.0.4.17/runoob01。
接着,稍微看一下 Checkout directory(检出至目录),这个字段应该要指向您的 runoob01 目录。

确认后,按下 OK 按钮,您应该可以看到如下的信息窗口。

这样就表示动作完成。按下 OK 按钮后,再到您刚刚建立的目录下。您将会看到 MyWork 目录下面多了一个名为 .svn 的目录(这个目录是隐藏的,如果您的档案管理员没有设定可以看到隐藏目录,您将无法看到它) 。

如果您要在一个已经存在的 SVN Server 上面 checkout 出上面的档案,您只需要给定正确的 SVN URL 以及要 checkout 目录的名称。就可以取得指定的档案及目录了。
add commit
新增档案及目录到 Repository 中 add commit
创建目录 dir01, 在目录里新增文件

将新增的文件加入到 SVN 版本控制中,TortoiseSVN 会把准备要加入的档案及目录,勾选需要加入的文件。

按下 OK 后,您将会看到如下的讯息窗口:

这个 Add(增加)的动作并未真正的将档案放到 Repository 中。仅仅是告知 SVN 准备要在 Repository 中放入这些档案。 此时的文件状态为:

这些档案真正的放入到 Repository 中,空白处右键选择 SVN commit(提交) 紧接着,您将会看到如下的窗口出现:

在这里可以清楚地了解到哪些档案要被 commit 到 repository(版本库)中。同样的,如果您有档案不想在这个时候 commit 到 Repository,您可以取消选取的档案,这样他们就不会被 commit 到 Repository 中。在“信息”文本框中可以写入对本次 commit 的说明。
点击“确认”后完成 commit 动作,然后您可以到 runoob 目录中,确定是否所有的档案 icon 都有如下的绿色勾勾在上面,这样代表您的档案都正确无误的到 repository 中。

update
更新档案及目录 update
由于版本控制系统多半都是由许多人共同使用。所以,同样的档案可能还有人会去进行编辑。为了确保您工作目录中的档案与 Repository 中的档案是同步的。建议您在编辑前都先进行更新的动作。
在想要更新的档案或目录 icon 上面按下鼠标右键。并且选择 SVN Update。

有时我们需要回溯至特定的日期或是版本,这时就可以利用 SVN 的 Update to revision 的功能。在想要更新的档案或目录 icon 上面按下鼠标右键。并且选择 TortoiseSVN->Update to revision(更新至版本)。

branch
复制档案及目录 branch
很多时候您会希望有另外一个复制的目录来进行新的编修。等到确定这个分支的修改已经完毕了,再合并到原来的主要开发版本上。举例来说,我们目前在runoob01/trunk下面有如下的目录及档案:

现在,我们要为 trunk 这个目录建立一个 branch。假设我们希望这个目录是在 D:\runoob01\branch。首先我们可以在 trunk 目录下面的空白处,或是直接在 trunk 的 icon 下面按下鼠标右键选择 Branch/Tag…(分支/标记)这个选项,您将会看到如下的对话框出现。


请先确认 From WC at URL(从工作副本/URL): 中的目录是您要复制的来源目录。接着,在 To URL(至路径)中输入您要复制过去的路径。通常我们会将所有的 branch 集中在一个目录下面。以上面的例子来说,branch 档案都会集中在 branch 的子目录下面。在 To URL 中您只需要输入您要的目录即可。目录不存在时,会由 SVN 帮您建立。特别需要注意的是 SVN 因为斜线作为目录分隔字符,而非反斜线。 接着在 Log message(日志信息)输入您此次 branch 的目的为何。按下 OK 就可以了。
如果成功,将可以看到下面的画面:

按下 OK 就可以关闭这个窗口了。如果您此时立刻去 runoob01 目录的 branch 子目录下面,您将会失望的发现在该目录下面并没有刚刚指定的目录存在。这是因为您 runoob01 目录的部份还是旧的,您只需要在 branch 子目录下面进行 SVN update 就可以看到这个新增的目录了。新增的目录就与原来的目录无关了。您可以任意对他进行编辑,一直到您确认好所有在 branch 下面该做的工作都完成后,您可以选择将这个 branch merge 回原来的 trunk 目录,或者是保留它在 branch 中。
merge
合并动作 merge
假如我们在 branch 分支中对文件进行了修改或增加了文件,要 merge 回 trunk 目录中,方法很简单。以上面的例子来说,我们在 D:\runoob01\trunk目录空白处,按下鼠标右键,选择 Merge(合并):

这个画面主要分为三个部份,前面的 From: 与 To: 是要问您打算从 Branch 中的哪个版本到哪个版本,merge 回原来的 trunk 目录中。因此,From 跟 To 的 URL 字段应当都是指定原来 branch 的目录下。剩下的就是指定要 merge 的 revision 范围。以上面的例子而言,我们从 Branch 的 Revision 7 开始 merge 到 Branch 下面的最新版本。您可以透过,Dry run 按钮,试作一次 Merge。这个 merge 只会显示一些讯息,不会真正的更新到 trunk 的目录去。只有按下 Merge 按钮后,才会真正的将 branch 的档案与 trunk 的档案合并起来。

如果您确认这次的 merge 没有问题,您可以直接使用 commit 来将这两个被修改的档案 commit 回 SVN repository 上。如果有问题,您可以直接修改这两个档案,直到确认 ok 了,再行 commit。
Release
制作 Tag 或是 Release
所谓的 Tag 或是 Release 就是一个特别的版本,因为这个版本可能有特别的意义。例如:这个版本是特别的 Milestone 或是 release 给客户的版本。其实,Tag 与 Release 的作法与 Branch 完全相同。只是 Branch 可能会需要 merge 回原来的 trunk 中,而 tag 及 release 大部分都不需要 merge 回 trunk 中。
举例来说,今天我们的 trunk 做了一版,这个版本被认定是软件的 1.0 版。 1.0版对于开发来说是一个非常重要的里程碑。所以我们要特别为他做一个标记,亦即 Tag。假设,这个 1.0 版是要正式 release 给客户或是相关 vendor,我们要可以为他做一个 Release 的标记。基本上,SVN 只有目录的概念,并没有什么 Tag 的用法。所以您会看到在 SVN 的选单上面,Branch 与 Tag 是同一个项目。以这个 1.0 的例子来说,我们在 runoob01 目录下创建 tags 目录用于存放打 tag 的版本,并提交到版本库,然后在 Trunk 上面,按下鼠标右键,选择 Branch/Tag 的项目:


成功的话,您就在对应的 Tag 目录下面建立了一个 v1.0 的目录。当然,如果您这时到 Tag 的目录下面去,会看不到这个目录,您需要在 Tag 目录下面 update 一下,才能看到它。

</article>

浙公网安备 33010602011771号