-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtools-vcs-svn.html
34 lines (32 loc) · 112 KB
/
tools-vcs-svn.html
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
<!DOCTYPE html>
<html lang="zh-CN" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>SVN | 广度和深度</title>
<meta name="description" content="整理和记录代码学习的笔记">
<link rel="preload stylesheet" href="/assets/style.66b7dec6.css" as="style">
<script type="module" src="/assets/app.f6aa04bd.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.2ed14f66.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/assets/chunks/framework.027d2da0.js">
<link rel="modulepreload" href="/assets/chunks/theme.98d176af.js">
<link rel="modulepreload" href="/assets/tools-vcs-svn.md.cba08751.lean.js">
<link rel="icon" href="./favicon.ico">
<script id="check-dark-light">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"dark",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-8692e0c2><!--[--><!--]--><!--[--><span tabindex="-1" data-v-7da17955></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-7da17955> Skip to content </a><!--]--><!----><header class="VPNav" data-v-8692e0c2 data-v-bcf310a9><div class="VPNavBar has-sidebar" data-v-bcf310a9 data-v-7192d962><div class="container" data-v-7192d962><div class="title" data-v-7192d962><div class="VPNavBarTitle has-sidebar" data-v-7192d962 data-v-56d4391f><a class="title" href="/" data-v-56d4391f><!--[--><!--]--><!--[--><img class="VPImage logo" src="./logo.jpg" alt data-v-506001e8><!--]--><!--[-->Coder<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-7192d962><div class="curtain" data-v-7192d962></div><div class="content-body" data-v-7192d962><!--[--><!--]--><div class="VPNavBarSearch search" data-v-7192d962><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg class="DocSearch-Search-Icon" width="20" height="20" viewBox="0 0 20 20" aria-label="search icon"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-7192d962 data-v-359face2><span id="main-nav-aria-label" class="visually-hidden" data-v-359face2>Main Navigation</span><!--[--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-359face2 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bb4a2dc7><span class="text" data-v-bb4a2dc7><!----><span data-v-bb4a2dc7>♎语言</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-bb4a2dc7><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><div class="items" data-v-5d7a6046><!--[--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/lang-java.html" data-v-b6a76a69><!--[-->1️⃣ Java<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/lang-python.html" data-v-b6a76a69><!--[-->2️⃣ Python<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/lang-scala.html" data-v-b6a76a69><!--[-->3️⃣ Scala<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/lang-groovy.html" data-v-b6a76a69><!--[-->4️⃣ Groovy<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-359face2 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bb4a2dc7><span class="text" data-v-bb4a2dc7><!----><span data-v-bb4a2dc7>☯️算法</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-bb4a2dc7><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><div class="items" data-v-5d7a6046><!--[--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>算法篇</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫代码规范<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫设计模式<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫数据结构<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫源码解读<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>并发篇</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫JVM<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫并发编程<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>设计篇</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫系统设计<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫数仓理论<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>职业篇</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫方向导航<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫职业规划<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫面试准备<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-359face2 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bb4a2dc7><span class="text" data-v-bb4a2dc7><!----><span data-v-bb4a2dc7>♈前端</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-bb4a2dc7><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><div class="items" data-v-5d7a6046><!--[--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫HTML<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫CSS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫JavaScript<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫JQuery<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫NodeJS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Vue<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫React<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫小程序<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-359face2 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bb4a2dc7><span class="text" data-v-bb4a2dc7><!----><span data-v-bb4a2dc7>🔯微服务</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-bb4a2dc7><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><div class="items" data-v-5d7a6046><!--[--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫RPC<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Spring<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Spring MVC<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Spring Boot<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Spring Cloud<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Spring Cloud Alibaba<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Service Mesh<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-359face2 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bb4a2dc7><span class="text" data-v-bb4a2dc7><!----><span data-v-bb4a2dc7>⚧️数据存储</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-bb4a2dc7><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><div class="items" data-v-5d7a6046><!--[--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>SQL数据库</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫MySQL<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Oracle<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>NoSQL数据库</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Redis<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫MongoDB<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>NewSQL数据库</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫TiDB<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>ORM框架</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Mybatis<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Mybatis Plus<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Spring Data JPA<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>消息中间件</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Active MQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫RabbitMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫RocketMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Kafka<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>文件存储</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫FastDFS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Ceph<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫HDFS<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>搜索引擎</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Lucene<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Solr<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫ElasticSearch<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-359face2 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bb4a2dc7><span class="text" data-v-bb4a2dc7><!----><span data-v-bb4a2dc7>☸️DevOps</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-bb4a2dc7><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><div class="items" data-v-5d7a6046><!--[--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>部署</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/devops-deploy-tomcat.html" data-v-b6a76a69><!--[-->Tomcat<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/devops-deploy-tomcat.html" data-v-b6a76a69><!--[-->🚫Linux<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/devops-deploy-shell.html" data-v-b6a76a69><!--[-->Shell<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/devops-deploy-tomcat.html" data-v-b6a76a69><!--[-->🚫Nginx<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/devops-deploy-tomcat.html" data-v-b6a76a69><!--[-->🚫Linux<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/devops-deploy-tomcat.html" data-v-b6a76a69><!--[-->🚫LVS+Keepalived<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/devops-deploy-tomcat.html" data-v-b6a76a69><!--[-->🚫OpenResty+Kong<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>容器</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Docker<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Kubernates<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>云服务器</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫IaaS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫UCloud<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>持续集成</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Jenkins<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>监控工具</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Arthas<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Zabbix<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>链路追踪</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Sleuth+Zipkin<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫Skywalking<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-5d7a6046 data-v-2d40012a><p class="title" data-v-2d40012a>性能压测</p><!--[--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫JMeter<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-2d40012a data-v-b6a76a69><a class="VPLink link" href="/#" data-v-b6a76a69><!--[-->🚫全链路压测<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-359face2 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-bb4a2dc7><span class="text" data-v-bb4a2dc7><!----><span data-v-bb4a2dc7>✝️工具</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-bb4a2dc7><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><div class="items" data-v-5d7a6046><!--[--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-soft.html" data-v-b6a76a69><!--[-->软性办公工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-vcs.html" data-v-b6a76a69><!--[-->版本控制工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->包管理工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->项目构建工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->编程工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->数据库管理<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->虚拟机工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->SSH工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->调试工具<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-5d7a6046 data-v-b6a76a69><a class="VPLink link" href="/tools-dev.html" data-v-b6a76a69><!--[-->压测工具<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-7192d962 data-v-5c7f08f3><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-5c7f08f3 data-v-f44e5024 data-v-23c4cb6c><span class="check" data-v-23c4cb6c><span class="icon" data-v-23c4cb6c><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-f44e5024><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-f44e5024><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-7192d962 data-v-4a4a2081 data-v-bb4a2dc7><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bb4a2dc7><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-bb4a2dc7><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-bb4a2dc7><div class="VPMenu" data-v-bb4a2dc7 data-v-5d7a6046><!----><!--[--><!--[--><!----><div class="group" data-v-4a4a2081><div class="item appearance" data-v-4a4a2081><p class="label" data-v-4a4a2081>深浅模式</p><div class="appearance-action" data-v-4a4a2081><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-4a4a2081 data-v-f44e5024 data-v-23c4cb6c><span class="check" data-v-23c4cb6c><span class="icon" data-v-23c4cb6c><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-f44e5024><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-f44e5024><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-7192d962 data-v-9cc97dbb><span class="container" data-v-9cc97dbb><span class="top" data-v-9cc97dbb></span><span class="middle" data-v-9cc97dbb></span><span class="bottom" data-v-9cc97dbb></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-8692e0c2 data-v-a8f7ff89><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-a8f7ff89><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-a8f7ff89><path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path><path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path><path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path><path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path></svg><span class="menu-text" data-v-a8f7ff89>菜单</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-a8f7ff89 data-v-a050d324><button data-v-a050d324>返回顶部</button><!----></div></div><aside class="VPSidebar" data-v-8692e0c2 data-v-cde32d1c><div class="curtain" data-v-cde32d1c></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-cde32d1c><span class="visually-hidden" id="sidebar-aria-label" data-v-cde32d1c> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>软性办公</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-baidupan.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>百度网盘</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-foxit.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>福昕阅读器</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-calibre.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Calibre</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-chrome.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Chrome</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-cmder.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Cmder</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-evernote.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Evernote</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-nodepad.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Nodepad</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-office.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Office</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-potplayer.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>PotPlayer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-snipaste.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Snipaste</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-sublimetext.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>SublimeText</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-typora.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Typora</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-tizi.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>科学上网</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-xmind.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Xmind</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-7zip.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>7zip</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-windows.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Windows</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-soft-markdown.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Markdown</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>版本管理</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-1f85ec84 data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h3 class="text" data-v-1f85ec84>Git</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-2 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-vcs-git.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Git</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-vcs-gogs.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Gogs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-vcs-gitee.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Gitee</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-vcs-github.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Github</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-vcs-gitlib.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>GitLib</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-vcs-gitflow.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>GitFlow</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-vcs-svn.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Svn</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>包管理工具</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-nvm.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>NVM</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>项目构建</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-maven.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Maven</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-gradle.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Gradle</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>编程工具</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-idea.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>IDEA</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-vscode.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>VsCode</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-pycharm.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>PyCharm</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>数据库管理</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-navicat.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Navicat</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>虚拟机工具</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-vmware.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>VMware</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>SSH工具</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-ssh.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>SSH工具</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>调试工具</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-postman.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>Postman</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cde32d1c><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cde32d1c data-v-1f85ec84><div class="item" role="button" tabindex="0" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><h2 class="text" data-v-1f85ec84>压测工具</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1f85ec84><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-1f85ec84><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-1f85ec84><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1f85ec84 data-v-1f85ec84><div class="item" data-v-1f85ec84><div class="indicator" data-v-1f85ec84></div><a class="VPLink link link" href="/tools-dev-jmeter.html" data-v-1f85ec84><!--[--><p class="text" data-v-1f85ec84>JMeter</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-8692e0c2 data-v-87044f80><div class="VPDoc has-sidebar has-aside" data-v-87044f80 data-v-e970bbc0><!--[--><!--]--><div class="container" data-v-e970bbc0><div class="aside" data-v-e970bbc0><div class="aside-curtain" data-v-e970bbc0></div><div class="aside-container" data-v-e970bbc0><div class="aside-content" data-v-e970bbc0><div class="VPDocAside" data-v-e970bbc0 data-v-0473afe5><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-0473afe5 data-v-b2f90363><div class="content" data-v-b2f90363><div class="outline-marker" data-v-b2f90363></div><div class="outline-title" role="heading" aria-level="2" data-v-b2f90363>目录</div><nav aria-labelledby="doc-outline-aria-label" data-v-b2f90363><span class="visually-hidden" id="doc-outline-aria-label" data-v-b2f90363> Table of Contents for current page </span><ul class="root" data-v-b2f90363 data-v-3d0f3048><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-0473afe5></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e970bbc0><div class="content-container" data-v-e970bbc0><!--[--><!--]--><!----><main class="main" data-v-e970bbc0><div style="position:relative;" class="vp-doc _tools-vcs-svn" data-v-e970bbc0><div><h1 id="svn" tabindex="-1">SVN <a class="header-anchor" href="#svn" aria-label="Permalink to "SVN""></a></h1><div class="warning custom-block"><p class="custom-block-title">过期警告</p><p>该项技术点已经逐渐淘汰,有精力的话可以增加阅读面,但是不推荐深入了解</p></div><h2 id="开发中的实际问题" tabindex="-1">开发中的实际问题 <a class="header-anchor" href="#开发中的实际问题" aria-label="Permalink to "开发中的实际问题""></a></h2><blockquote><p>从实际问题阐述为什么需要SVN做代码管理</p></blockquote><p>小明负责的模块就要完成了,就在即将 Release 之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流</p><ul><li>需求之一:备份!</li></ul><p>这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的代码已经回不到从前了。什么地方能买到哆啦 A 梦的时光机啊?</p><ul><li>需求之二:代码还原!</li></ul><p>小刚和小强先后从文件服务器上下载了同一个文件:Analysis.java。小刚在Analysis.java 文件中的第 30 行声明了一个方法,叫 count(),先保存到了文件服务器上;小强在 Analysis.java 文件中的第 50 行声明了一个方法,叫 sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记忆中了</p><ul><li>需求之三:协同修改!</li></ul><p>老许是一位项目经理,我会告诉你他把每一个版本都保存一份吗?我会告诉你这些工程里其实有很多文件都是重复的吗?我会告诉你老许为这事删了很多电影吗?</p><ul><li>需求之四:多版本项目文件管理!</li></ul><p>老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这次来说吧,有个该死的 Bug 调试了 30 多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘流和正经牛都不承认是自己干的!</p><ul><li>需求之五:追溯问题代码的编写人和编写时间!</li></ul><p>小温这两天幸福的如同掉进了蜜罐里,因为他成功的得到了前台 MM 丽丽的芳心,可他郁闷的是这几天总是收到 QA 小组的邮件,要求他修正程序中存在的 Bug,可他自己本地电脑上是没有这些 Bug 的,“难道我的代码被哪个孙子给改了?”。是的,小温没来的时候,丽丽是 QA 小组小郑的女朋友啊!</p><ul><li>需求之六:权限控制!</li></ul><p>版本控制简介版本控制[Revision control],最初来源于工程设计领域,是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。</p><p>Subversion 就是一款实现版本控制的工具软件,通常也称为版本控制器,简称 SVN。Subversion 是 Apache 软件基金会组织下的一个项目。</p><p>Subversion 的优良特性</p><p>**目录版本控制:**CVS 只能追踪单个文件的历史,但是 Subversion 实现了一个“虚拟”文件系统,可以追踪整个目录树的修改,文件和目录都是版本控制的,结果就是可以在客户端对文件和目录执行移动和复制命令。</p><p>**原子提交:**提交要么完全进入版本库,要么一点都没有,这允许开发者以一个逻辑块提交修改。</p><p>**版本控制的元数据:**每个文件和目录都有一组附加的“属性”,你可以发明和保存任意的键/值对,属性也会像文件内容一样被纳入版本控制</p><p>**可选的网络层:**Subversion 在版本库访问方面有一个抽象概念,利于人们去实现新的网络机制,Subversion 的“高级”服务器是 Apache 网络服务器的一个模块,使用 HTTP的变种协议 WebDAV/DeltaV 通讯,这给了 Subversion 在稳定性和交互性方面很大的好处,可以直接使用服务器的特性,例如认证、授权、传输压缩和版本库浏览等等。也有一个轻型的,单独运行的 Subversion 服务器,这个服务器使用自己的协议,可以轻松的用 SSH 封装。</p><p>**一致的数据处理:**Subversion 使用二进制文件差异算法展现文件的区别,对于文本(人类可读)和二进制(人类不可读)文件具备一致的操作方式,两种类型的文件都压缩存放在版本库中,差异在网络上双向传递。</p><p>**高效的分支和标签:**分支与标签的代价不与工程的大小成比例,Subversion 建立分支与标签时只是复制项目,使用了一种类似于硬链接的机制,因而这类操作通常只会花费很少并且相对固定的时间,以及很小的版本库空间</p><h2 id="svn-的工作原理" tabindex="-1">SVN 的工作原理 <a class="header-anchor" href="#svn-的工作原理" aria-label="Permalink to "SVN 的工作原理""></a></h2><p>采取客户端/服务器模式——在服务器的版本库中保存项目文件的各个版本,所有参与协同开发的程序员在自己本地电脑上保存一个工作副本。SVN 支持程序员将本地副本更新到服务器端的最新版本,也支持将本地副本的最新改变更新到服务器端,而且后面的更新不会覆盖前面的更新,而是作为一个新的版本被保存下来——SVN甚至支持将本地工作副本恢复为服务器端保存的某一个历史版本。</p><p><img src="/images/image-20230914192851877.png" alt="image-20230914192851877"></p><h2 id="svn-基本操作" tabindex="-1">SVN 基本操作 <a class="header-anchor" href="#svn-基本操作" aria-label="Permalink to "SVN 基本操作""></a></h2><ol><li><p><strong>检出</strong>(checkout):将一个服务器端创建好的项目整个下载到本地,这是到项目组后参与开发的第一步,只需执行一次。</p></li><li><p><strong>更新</strong>(update):将本地文件更新为服务器端的最新版本,通常为每天上班时或修改公共文件之前执行一次。</p></li><li><p><strong>提交</strong>(commit):将本地修改提交到服务器端。通常每天下班前或每实现一个功能、完成一个模块时执行一次</p></li></ol><h2 id="subversion-安装与配置" tabindex="-1">Subversion 安装与配置 <a class="header-anchor" href="#subversion-安装与配置" aria-label="Permalink to "Subversion 安装与配置""></a></h2><h3 id="安装服务器端程序" tabindex="-1">安装服务器端程序 <a class="header-anchor" href="#安装服务器端程序" aria-label="Permalink to "安装服务器端程序""></a></h3><ol><li>服务器端程序版本目前 Subversion 的最新版本是 <code>1.9.0-alpha2</code>,这是一个测试版。官方网站推荐使用的版本是 1.8.9,</li></ol><p>原话是:<code>The best available version of Apache Subversion is: 1.8.9</code></p><ol start="2"><li>下载源码包</li></ol><p>Apache 组织自己维护更新的只是 Subversion 的源码,各个版本的源码包的下载地址是:<a href="http://subversion.apache.org/download/Subversion" target="_blank" rel="noreferrer">http://subversion.apache.org/download/Subversion</a> 源码是使用 C 语言开发的。</p><ol start="3"><li>下载二进制安装包</li></ol><p>Subversion 在不同平台下的二进制包是由不同组织构建实现的,Windows 平台下的二进制包实现情况如下</p><p><img src="/images/image-20230914192915028.png" alt="image-20230914192915028"></p><p>所以,服务器端程序的下载地址可以使用:<a href="http://sourceforge.net/projects/win32svn/files/latest/download" target="_blank" rel="noreferrer">http://sourceforge.net/projects/win32svn/files/latest/download</a></p><p>下载到的文件是:<code>Setup-Subversion-1.8.9-1.msi</code></p><ol><li><p>双击运行 <code>Setup-Subversion-1.8.9-1.msi</code>,一路下一步</p></li><li><p>安装程序会自动配置 Path 环境变量 <code>d:\tools\Subversion\bin</code>.所以 bin 目录下的可执行文件可以在任意目录下运行。</p></li><li><p>验证是否安装成功</p></li></ol><p>在命令行输入:<code>svn --version</code>.看到如下信息就表示服务器端程序安装成功</p><p><img src="/images/image-20230914193049628.png" alt="image-20230914193049628"></p><h3 id="配置版本库" tabindex="-1">配置版本库 <a class="header-anchor" href="#配置版本库" aria-label="Permalink to "配置版本库""></a></h3><ol><li>为什么要配置版本库?</li></ol><p>Subversion 是将文件数据信息保存到版本库中进行管理的,为了满足用户的不同需求,Subversion 允许用户对版本库目录进行定制。</p><ol start="2"><li><p>在一个非中文无空格目录下创建一个文件夹,作为版本库的根目录。例如:D:\DevRepository\Subversion</p></li><li><p>在版本库根目录下创建与具体项目对应的子目录——这样做的目的是使一个SVN 服务器能够同时管理多个项目,而不是为每一个项目搭建一个 SVN 服务器——这显然太浪费资源了。</p></li></ol><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">例如:</span></span>
<span class="line"><span style="color:#e1e4e8;">D:\DevRepository\Subversion\CRM</span></span>
<span class="line"><span style="color:#e1e4e8;">D:\DevRepository\Subversion\ERP</span></span>
<span class="line"><span style="color:#e1e4e8;">D:\DevRepository\Subversion\OA</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">例如:</span></span>
<span class="line"><span style="color:#24292e;">D:\DevRepository\Subversion\CRM</span></span>
<span class="line"><span style="color:#24292e;">D:\DevRepository\Subversion\ERP</span></span>
<span class="line"><span style="color:#24292e;">D:\DevRepository\Subversion\OA</span></span></code></pre></div><p>④创建版本库,命令格式</p><p><img src="/images/image-20230914193210574.png" alt="image-20230914193210574"></p><p>⑤版本库目录结构</p><p>版本库创建成功后会在指定目录下产生如下的目录结构</p><p><img src="/images/image-20230914193421052.png" alt="image-20230914193421052"></p><h3 id="启动服务器端程序" tabindex="-1">启动服务器端程序 <a class="header-anchor" href="#启动服务器端程序" aria-label="Permalink to "启动服务器端程序""></a></h3><ol><li><p>SVN 服务器必须处于运行状态才能响应客户端请求,帮助我们管理项目文件。所以我们必须将 SVN 服务器启动起来。启动 SVN 服务器有两种方法,一个是命令行方式,一个是注册 Windows 服务。</p></li><li><p>命令行方式</p></li></ol><p>[1]命令格式</p><p><img src="/images/image-20230914193457106.png" alt="image-20230914193457106"></p><p>[2]验证服务是否启动</p><p>SVN 服务监听 3690 端口,打开一个新的 cmd 窗口,使用 netstat -an 命令查看 3690端口是否被监听</p><p><img src="/images/image-20230914193524474.png" alt="image-20230914193524474"></p><p>[3]命令行方式的缺陷是:只要运行服务器端程序的命令行窗口一关闭,服务就停止了,很不方便,而且每次开机都需要手动启动。</p><ol start="3"><li>注册 Windows 服务</li></ol><p>[1]将SVN 服务端程序注册为 Windows 服务,就可以让SVN 服务随系统一起启动,克服了命令行方式的不足。</p><p>[2]注册 Windows 服务需要利用 XP、2000 以上系统自带工具 Service Control,执行文件是 sc.exe,注意这个命令不是 SVN 的命令。</p><p>[3]命令格式</p><p><img src="/images/image-20230914193543404.png" alt="image-20230914193543404"></p><p>[4]binpath 组成结构说明</p><p><img src="/images/image-20230914193554971.png" alt="image-20230914193554971"></p><p>[5]关于“版本库目录”</p><p><img src="/images/image-20230914193603339.png" alt="image-20230914193603339"></p><p>[6]最终命令举例</p><p><img src="/images/image-20230914193612973.png" alt="image-20230914193612973"></p><p>●在 Win7 及以上系统中,运行该命令需要管理员权限,否则会得到如下错误提示</p><p><img src="/images/image-20230914193620805.png" alt="image-20230914193620805"></p><p>●解决的办法是以管理员身份运行 cmd 命令行窗口即可</p><p><img src="/images/image-20230914193630181.png" alt="image-20230914193630181"></p><p>●在防火墙或电脑卫士提示阻止时,选择允许</p><p><img src="/images/image-20230914193641314.png" alt="image-20230914193641314"></p><p>●此时查看当前系统中的服务,可以看到我们刚刚创建的服务,但此时它还没有启动,如果创建失败,需检查 sc 命令是否正确</p><p><img src="/images/image-20230914193650149.png" alt="image-20230914193650149"></p><p>●打开命令行窗口运行 netstat –an 查看 3690 端口是否被监听</p><p>●如果启动失败,那很有可能是 binpath 中的内容有错误,此时只能将已经创建的服务删除,重新创建。</p><p>●删除服务之前,最好先停止服务。停止服务的命令格式如下:</p><p><img src="/images/image-20230914193659467.png" alt="image-20230914193659467"></p><p>●删除服务的命令格式如下:</p><p><img src="/images/image-20230914193710432.png" alt="image-20230914193710432"></p><p>●删除、启动、停止服务同样需要管理员权限</p><h3 id="命令行模式访问-svn" tabindex="-1">命令行模式访问 SVN <a class="header-anchor" href="#命令行模式访问-svn" aria-label="Permalink to "命令行模式访问 SVN""></a></h3><h4 id="检出" tabindex="-1"><strong>检出</strong> <a class="header-anchor" href="#检出" aria-label="Permalink to "**检出**""></a></h4><ul><li>首先进入自己的工作目录,例如:D:\DevWorkSpace\SVNSpace</li><li>运行 svn checkout 命令,命令格式如下</li></ul><p><img src="/images/image-20230914193719549.png" alt="image-20230914193719549"></p><ul><li>工作副本: 运行 checkout 命令后进入 MyERP 目录,看到里面什么都没有。真的什么都没有吗?不是的。检出命令会在这一目录下创建一个隐藏目录.svn,用来保存与服务器交互的重要信息,其中包括从服务器端取回的最新版本信息、文件状态、更新时间等。SVN 正是以此为依据判断当前目录中文件的状态。所以这个隐藏目录<strong>千****万不要删除或修改其中的内容</strong>——完全无视它的存在吧。如果服务器端保存的文件可以视为一个“正本”,那么每个开发人员检出到本地目录的文件可以视为“副本”,通常称为工作副本</li></ul><h4 id="提交" tabindex="-1">提交 <a class="header-anchor" href="#提交" aria-label="Permalink to "提交""></a></h4><ul><li>进入 D:\DevWorkSpace\SVNSpace\MyERP 目录</li><li>创建一个文件 test.txt</li><li>执行 svn commit 命令,运行结果是</li></ul><p><img src="/images/image-20230914193751940.png" alt="image-20230914193751940"></p><p>说明一个文件必须纳入版本控制才可以提交到服务器端。</p><ul><li>执行 svn add 命令,将 test.txt 纳入版本控制</li></ul><p><img src="/images/image-20230914193802057.png" alt="image-20230914193802057"></p><ul><li>再次执行 svn commit 命令</li></ul><p><img src="/images/image-20230914193855439.png" alt="image-20230914193855439"></p><p>此时要求附加日志信息</p><ul><li>使用-m 参数附加日志信息</li></ul><p><img src="/images/image-20230914193907150.png" alt="image-20230914193907150"></p><p>原因是没有权限</p><ul><li>暂时先开启匿名访问权限 <ul><li>[1]进入对应的版本库目录下的 conf 目录:D:\DevRepository\Subversion\ERP\conf</li><li>[2]打开 svnserve.conf</li><li>[3]将第 19 行的# anon-access = read 改为 anon-access = write,也就是去掉“# ”,将 read 改为 write。注意前面不要留空格,一定要顶格写。</li><li>[4]不需要重启 SVN 服务,甚至命令行窗口都不需要重新打开。</li></ul></li><li>重新执行提交命令</li></ul><p><img src="/images/image-20230914193923291.png" alt="image-20230914193923291"></p><p>说明提交成功了。</p><ul><li>其实 svn commit 命令最后可以不指定具体文件,此时表示提交当前工作副本中的所有修改。</li></ul><h4 id="更新" tabindex="-1">更新 <a class="header-anchor" href="#更新" aria-label="Permalink to "更新""></a></h4><ul><li>将服务器端文件检出到一个新的目录,模拟另外一个终端</li></ul><p><img src="/images/image-20230914193942491.png" alt="image-20230914193942491"></p><ul><li>回到 MyERP 目录,对 test.txt 文件修改后提交。</li><li>进入 TomERP 目录</li><li>执行 svn update 命令</li></ul><p><img src="/images/image-20230914193950620.png" alt="image-20230914193950620"></p><p>这样我们就可以在 TomERP 目录下看到 MyERP 目录下提交的修改。</p><ul><li>思考:更新和检出的相同点和不同点分别是什么?</li></ul><p><img src="/images/image-20230914193959964.png" alt="image-20230914193959964"></p><h3 id="工作副本中文件的几种状态" tabindex="-1">工作副本中文件的几种状态 <a class="header-anchor" href="#工作副本中文件的几种状态" aria-label="Permalink to "工作副本中文件的几种状态""></a></h3><ul><li>①没有修改,现行版本</li></ul><p>本档案在工作目录中没有被修改,而且自当前版本之后,其他终端也没有任何该文件的修改被提交到服务器,即当前工作副本的版本和服务器端最新版本是一致的。对它执行 svn commit 和 svn update 都不会发生任何事。</p><ul><li>②本地修改, 现行版本</li></ul><p>这个文件被修改过,但这个修改还没有提交到服务器,而且自当前版本之后,其他终端也没有任何该文件的修改被提交到服务器,所以当前工作副本的版本和服务器端最新版本仍然是一致的。由于有尚未送交回去的本地修改,所以对它的svn commit 会成功提交你的修改,而 svn update 则不会作任何事。</p><ul><li>③没有修改,过时版本</li></ul><p>这个文件没有修改,但是版本库中有其他终端提交的修改。此时当前工作副本的版本比服务器端的版本落后了,我们称之为“过时”。对当前文件的 svn commit 不会发生任何事,而 svn update 会让工作目录中的文件更新至最新版本。</p><ul><li>④本地修改,过时版本</li></ul><p>服务器端存在没有更新到本地的修改,导致当前版本过时。如果这个文件在本地有未提交的修改,则无法提交,对它执行 svn commit 会产生“out-of-date”错误。</p><p>此时应该先尝试更新本地文件。更新时 SVN 会尝试将服务器端的更新与本地文件进行合并,合并的结果有两种可能:一个是服务器端和本地修改位于文件的不同位置,合并成功;另一个是服务器端的修改正好和本地修改位于同一个位置,发生冲突。</p><p>4.5 将工作副本整体回复到某一个历史版本</p><p>①假设当前版本为 12,想要取回版本 9</p><p>②执行 svn update 命令</p><p><img src="/images/image-20230914194013669.png" alt="image-20230914194013669"></p><p>③这里需要注意的是,SVN 版本号并不是对某一个文件进行编号,而是对应整个版本库总体状态的一个“快照”,取回某个版本不是取回版本号对应的某个文件,而是整个项目的一个快照。</p><p><img src="/images/image-20230914194023363.png" alt="image-20230914194023363"></p><p>将某个文件恢复到某个版本中的状态,同时不涉及其他文件</p><p>①假设想要取回 pp.txt 在版本 10 时的状态</p><p>②执行 svn update 命令</p><p><img src="/images/image-20230914194032330.png" alt="image-20230914194032330"></p><p>③综合这两个例子,我们可以认为版本号和文件名构成了一个横纵坐标系,通过文件路径和版本号定位其在某一个时刻的状态</p><p><img src="/images/image-20230914194039809.png" alt="image-20230914194039809"></p><h3 id="单一版本库权限配置" tabindex="-1">单一版本库权限配置 <a class="header-anchor" href="#单一版本库权限配置" aria-label="Permalink to "单一版本库权限配置""></a></h3><p>匿名访问:前已述及。</p><p>授权访问</p><ul><li>要设置授权访问就需要创建用户,并为用户设定权限</li><li>打开授权访问的配置</li></ul><p>[1]打开<code>D:\DevRepository\Subversion\ERP\conf\svnserve.conf</code></p><p>[2]将第 19 行 <code>anon-access = write</code> 注释掉:<code># anon-access = write</code> 表明该版本库不接受匿名访问</p><p>[3]将第 20 行<code># auth-access = write</code>注释打开:<code>auth-access = write</code> 表明该版本库使用授权访问</p><p>[4]将第 27 行注释打开:<code>password-db = passwd</code> 表明使用同目录下的 passwd 文件保存用户信息</p><p>[5]将第 36 行注释打开:`authz-db = authz 表明使用同目录下的 authz 文件保存权限信息</p><p>[6]打开 passwd 文件创建用户</p><p><img src="/images/image-20230914194051068.png" alt="image-20230914194051068"></p><p>[7]打开 authz 文件:<code>#后面注释的是例子</code></p><p><1>创建用户组</p><p><img src="/images/image-20230914194057136.png" alt="image-20230914194057136"></p><p><2>指定路径,给用户和用户组授权</p><p><img src="/images/image-20230914194104819.png" alt="image-20230914194104819"></p><p><3>权限的继承性:父目录设置的权限,对子目录同样有效——除非子目录进行了更为具体的设定</p><p><img src="/images/image-20230914194113769.png" alt="image-20230914194113769"></p><p>这个例子表示当前版本库下的 subDir 目录只有 userOther 有读写权限,其它用户无任何权限</p><h3 id="多版本库共享配置" tabindex="-1">多版本库共享配置 <a class="header-anchor" href="#多版本库共享配置" aria-label="Permalink to "多版本库共享配置""></a></h3><hr><ul><li>在版本库根目录 <code>D:\DevRepository\Subversion</code> 下创建 commConf 目录</li><li>将未修改的 authz 和 passwd 文件拷贝到 commConf 目录下</li><li>修改需要设置权限的版本库的 svnserve.conf 文件</li></ul><div class="language-properties vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">properties</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#F97583;">password-db</span><span style="color:#E1E4E8;"> = ../../commConf/passwd</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">authz-db</span><span style="color:#E1E4E8;"> = ../../commConf/authz</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#D73A49;">password-db</span><span style="color:#24292E;"> = ../../commConf/passwd</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;">authz-db</span><span style="color:#24292E;"> = ../../commConf/authz</span></span></code></pre></div><ul><li>在 password 中创建用户</li></ul><p><img src="/images/image-20230914194137695.png" alt="image-20230914194137695"></p><ul><li>在 authz 中针对不同版本库为不同用户授予权限</li></ul><p><img src="/images/image-20230914194148848.png" alt="image-20230914194148848"></p><h3 id="查看工作副本信息" tabindex="-1">查看工作副本信息 <a class="header-anchor" href="#查看工作副本信息" aria-label="Permalink to "查看工作副本信息""></a></h3><p>①使用 <code>svn info</code> 命令</p><p>②执行效果如下</p><p><img src="/images/image-20230914194157973.png" alt="image-20230914194157973"></p><p>对某一个文件使用 <code>svn info</code> 命令</p><p><img src="/images/image-20230914194205607.png" alt="image-20230914194205607"></p><p><img src="/images/image-20230914194209378.png" alt="image-20230914194209378"></p><h3 id="查看目录或文件日志信息" tabindex="-1">查看目录或文件日志信息 <a class="header-anchor" href="#查看目录或文件日志信息" aria-label="Permalink to "查看目录或文件日志信息""></a></h3><p>①使用 <code>svn log</code> 命令</p><p>[注意:使用这个命令的前提是设置匿名访问为 none,即:anon-access = none,否则会出现“svn: E220001: 条目不可读”错误]</p><p>②执行效果如下</p><p><img src="/images/image-20230914194216625.png" alt="image-20230914194216625"></p><h2 id="eclipse-安装-svn-插件" tabindex="-1">Eclipse 安装 SVN 插件 <a class="header-anchor" href="#eclipse-安装-svn-插件" aria-label="Permalink to "Eclipse 安装 SVN 插件""></a></h2><hr><p>Eclipse 插件应用市场:在 Eclipse 中访问 Eclipse Marketplace Client 可以搜索 Subversion,下载插件,按提示安装即可。</p><p>使用压缩包:如果不能联网可以使用下载好的插件压缩包 eclipse_svn_site-1.10.5.zip,这个压缩包是从 <a href="http://subclipse.tigris.org/%E7%BD%91%E7%AB%99%EF%BC%88subclipse" target="_blank" rel="noreferrer">http://subclipse.tigris.org/网站(subclipse</a> 是这款 Eclipse 插件的名称)上下载的。安装方法是:</p><ul><li>①解压 eclipse_svn_site-1.10.5.zip 中的 features 和 plugins 这两个目录</li><li>②将 features 和 plugins 复制到 Eclipse 安装目录/dropins/eclipse_svn_site-1.10.5 下</li><li>③重启 Eclipse</li><li>④进入 Eclipse 依次打开 Window→Preferences→Team→SVN,看到如下界面即说明 SVN 插件安装成功</li></ul><p><img src="/images/image-20230914194231549.png" alt="image-20230914194231549"></p><h3 id="创建资源库位置" tabindex="-1">创建资源库位置 <a class="header-anchor" href="#创建资源库位置" aria-label="Permalink to "创建资源库位置""></a></h3><p>①切换到透视图 SVN 资源库研究</p><p>②创建资源库位置</p><p><img src="/images/image-20230914194247233.png" alt="image-20230914194247233"></p><p><img src="/images/image-20230914194251919.png" alt="image-20230914194251919"></p><p>此时可以查看版本库中的文件及目录结构</p><p><img src="/images/image-20230914194300466.png" alt="image-20230914194300466"></p><p>补充:如何确定版本库地址?</p><p><img src="/images/image-20230914194307048.png" alt="image-20230914194307048"></p><h3 id="检出-1" tabindex="-1">检出 <a class="header-anchor" href="#检出-1" aria-label="Permalink to "检出""></a></h3><p>①检出分两种情况</p><p><1>从服务器端获取到的是一些零散的文件,不能作为项目检出</p><p><img src="/images/image-20230914194314885.png" alt="image-20230914194314885"></p><p>此时会弹出一个新建项目向导,之所以会这样是因为我们需要创建一个项目来保存从服务器端取回的文件</p><p><img src="/images/image-20230914194326021.png" alt="image-20230914194326021"></p><p><2>从服务器端获取到的是一个完整的项目,例如</p><p><img src="/images/image-20230914194333294.png" alt="image-20230914194333294"></p><p>此时必须作为项目检出</p><p><img src="/images/image-20230914194341055.png" alt="image-20230914194341055"></p><p>项目从服务器检出后,会成为一个工作副本,根目录下会自动创建.svn 隐藏目录</p><h3 id="提交-1" tabindex="-1">提交 <a class="header-anchor" href="#提交-1" aria-label="Permalink to "提交""></a></h3><p>①新创建文件后,文件图标上会以“?”标识,表示该文件尚未纳入版本控制</p><p>②在新创建的文件上点右键→Team→添加至版本控制,这样文件图标上会显示“+”,表示当前文件已纳入版本控制,但还未提交至服务器。</p><p>③在要提交的文件上点右键→Team→提交...会提交文件,在弹出的对话框中可以不填写日志。文件提交后,图标会变为“金色的圆柱体”表示当前文件的版本和服务器端一致。</p><p>④文件修改后图标会变为“*”,表示当前文件或目录包含未提交的修改。</p><h3 id="更新-1" tabindex="-1">更新 <a class="header-anchor" href="#更新-1" aria-label="Permalink to "更新""></a></h3><p>①更新整个项目时可以在项目上点右键→Team→更新</p><p>②更新某个具体的文件时,可以在文件上点右键→Team→更新</p><h3 id="共享项目" tabindex="-1">共享项目 <a class="header-anchor" href="#共享项目" aria-label="Permalink to "共享项目""></a></h3><p>①在 Eclipse 中创建的新项目想要发布到 SVN 服务器端,可以通过“共享”项目实现</p><p>②在项目上点右键→Team→Share Project...→选择一种版本控制工具</p><p><img src="/images/image-20230914194351520.png" alt="image-20230914194351520"></p><p>选择一个资源库位置</p><p><img src="/images/image-20230914194359056.png" alt="image-20230914194359056"></p><p><img src="/images/image-20230914194402653.png" alt="image-20230914194402653"></p><p>切换到 Team Synchronizing 透视图,选择项目中要提交的内容,通常是项目中的全部内容</p><p><img src="/images/image-20230914194412231.png" alt="image-20230914194412231"></p><p>回复历史版本</p><p>①在需要回复的文件上点右键→Team→显示资源历史记录→得到如下界面</p><p><img src="/images/image-20230914194420884.png" alt="image-20230914194420884"></p><p>②选择某一个历史记录点右键→获取内容。文件就会恢复到指定版本的状态,同时图标变为“*”。</p><p>③获取历史记录时,如果出现如下错误提示</p><p><img src="/images/image-20230914194428136.png" alt="image-20230914194428136"></p><p>可以通过将对应版本库中的 svnserve.conf 文件中的 anon-access 设置为 none 解决。</p><h3 id="解决冲突" tabindex="-1">解决冲突 <a class="header-anchor" href="#解决冲突" aria-label="Permalink to "解决冲突""></a></h3><hr><p>①什么情况下会发生冲突</p><p><img src="/images/image-20230914194436109.png" alt="image-20230914194436109"></p><ol><li>两个开发人员,Harry 和 Sally,分别从服务器端下载了文件 A。</li><li>Harry 修改之后,A 变成了 A’,Sally 修改之后,A 变成了 A’’。</li><li>Harry 先一步提交,使服务器端文件的版本也变成了 A’</li><li>Sally 本地的文件 A’’已经过时了,此时她已无法提交文件,服务器会要求她先进行一次更新操作。</li><li>此时 Sally 的更新操作有两种可能</li></ol><ul><li>Sally 所做的修改与 Harry 不是同一个位置,更新操作尝试合并文件成功。</li><li>Sally 所做的修改与 Harry 恰好是同一个位置,更新操作尝试合并文件失败,发生冲突。</li></ul><p><strong>发生冲突后,本地工作副本会发生如下变化</strong></p><ul><li>文件 A 中的内容发生如下改变</li></ul><p><img src="/images/image-20230914194448673.png" alt="image-20230914194448673"></p><p>其中,从<<<<<<< .mine 到=======之间是发生冲突时本地副本的内容。从=======到>>>>>>> .r14 是发生冲突时服务器端的最新内容。注意这里 r 后面的数字是发生冲突时服务器端的版本号,有可能是任何整数值,r14 只是一个例子。同时文件图标变成一个“黄色的!”。</p><ul><li>与冲突文件同目录下新增文件,扩展名为.mine,其内容是发生冲突时本地副本的文件内容。</li><li>与冲突文件同目录下新增文件,扩展名为.r 小版本号,例如 MyCRM.java.r13,其内容是冲突发生之前,服务器端的文件内容,可以作为解决冲突的参照。</li><li>与冲突文件同目录下新增文件,扩展名为.r 大版本号,例如 MyCRM.java.r14,其内容是冲突发生时,服务器端的文件内容。</li></ul><p>②解决冲突</p><p>(1)在冲突文件上点右键→Team→编辑冲突...→出现如下界面</p><p><img src="/images/image-20230914200148896.png" alt="image-20230914200148896"></p><p>以对比的方式将本地内容与冲突内容显示出来,其中左侧为本地内容,右侧为冲突内容。其中本地内容是可以修改的。</p><p>(2)根据需要和实际情况将本地内容更正——这个过程很可能需要牵涉冲突的两位开发人员进行必要的沟通——机器与程序目前还不能完全取代人工智能。更正后文件图标会变成一个“四角形”,同时冲突文件内的<<<<<<< .mine、=======以及>>>>>>> .r14 等标记都会被去掉。</p><p>(3)在冲突文件上点右键→Team→标记为解决</p><p><img src="/images/image-20230914200200320.png" alt="image-20230914200200320"></p><p>此时.mine 文件和.r 版本号文件都会被自动删除,冲突文件的图标变为“*”,表示可以提交。</p><p>(4)提交文件,文件图标变为“金色圆柱体”。</p><h2 id="tortoisesvn-独立客户端" tabindex="-1">TortoiseSVN 独立客户端 <a class="header-anchor" href="#tortoisesvn-独立客户端" aria-label="Permalink to "TortoiseSVN 独立客户端""></a></h2><p>TortoiseSVN 简介:TortoiseSVN 是一个 Windows 下的版本控制系统 Apache™ Subversion®的客户端工具。</p><p><img src="/images/image-20230914200210983.png" alt="image-20230914200210983"></p><h3 id="tortoisesvn-的优良特性" tabindex="-1">TortoiseSVN 的优良特性 <a class="header-anchor" href="#tortoisesvn-的优良特性" aria-label="Permalink to "TortoiseSVN 的优良特性""></a></h3><p>①外壳集成</p><p>TortoiseSVN 无缝地整合进 Windows 的外壳(例如资源管理器)。</p><p>②重载图标</p><p>每个版本控制的文件和目录的状态使用小的重载图标表示,可以让你立刻看出工作副本的状态。</p><p>③图形用户界面</p><p>当你列出文件或文件夹的更改时,你可以点击任意版本查看提交注释。也可以看到更改过的文件列表 - 只要双击文件就可以查看更改内容。</p><p>提交对话框列出了本次提交将要包括的条目,每一个条目有一个复选框,所以你可以选择包括哪些条目。未版本控制的文件也会被列出,以防你忘记添加新文件。</p><p>④Subversion 命令的简便访问</p><p>所有的 Subversion 命令存在于资源管理器的右键菜单,TortoiseSVN 在那里添加子菜单。</p><h3 id="tortoisesvn-的历史" tabindex="-1">TortoiseSVN 的历史 <a class="header-anchor" href="#tortoisesvn-的历史" aria-label="Permalink to "TortoiseSVN 的历史""></a></h3><p>2002 年,Tim Kemp 发现 Subversion 是一个非常好的版本管理系统,但是缺乏一个好的图形界面客户端程序。做一个与 Windows 外壳整合的 Subversion 客户端程序的想法是受一个叫 TortoiseCVS 的 CVS 客户端程序所启发的。Tim 研究了 TortoiseCVS 的源码并以此为 TortoiseSVN 的基础。他开始运作这个项目,注册了域名 <a href="http://tortoisesvn.org" target="_blank" rel="noreferrer">tortoisesvn.org</a> 并且将源码放在了网上。就在同时, Stefan Küng 正在寻找一个好用的并且免费的版本控制系统。他找到了 Subversion 和 TortoiseSVN 的源码。因为 TortoiseSVN 还不能使用,他加入了项目并开始码。很快,他就重写了现有的大部分代码并开始添加命令和功能,到了某个时段,最初的代码已经都被改写了。由于 Subversion 变得越来越稳定,它吸引了越来越多用户,他们同时也开始使用 TortoiseSVN 作为 Subversion 的客户端程序。用户数量快速增长(并且每天还在增长)。这时候,Lübbe Onken 提出帮助项目提供精美的图标和 TortoiseSVN的标志。现在他负责照看网站和管理多语言翻译。</p><h3 id="tortoisesvn-安装" tabindex="-1">TortoiseSVN 安装 <a class="header-anchor" href="#tortoisesvn-安装" aria-label="Permalink to "TortoiseSVN 安装""></a></h3><ol><li>下载安装程序:<a href="http://tortoisesvn.net/downloads.html" target="_blank" rel="noreferrer">http://tortoisesvn.net/downloads.html</a></li></ol><ul><li><p>Win32 位:TortoiseSVN-1.8.7.25475-win32-svn-1.8.9.msi</p></li><li><p>Win64 位:TortoiseSVN-1.8.7.25475-x64-svn-1.8.9.msi</p></li><li><p>Win32 位语言包:LanguagePack_1.8.7.25475-win32-zh_CN.msi</p></li><li><p>Win64 位语言包:LanguagePack_1.8.7.25475-x64-zh_CN.msi</p></li></ul><ol start="2"><li>以 Win32 位为例,常规操作,略</li></ol><p>在任意目录下点右键→TortoiseSVN→settings</p><p><img src="/images/image-20230914200336091.png" alt="image-20230914200336091"></p><h3 id="检出-2" tabindex="-1">检出 <a class="header-anchor" href="#检出-2" aria-label="Permalink to "检出""></a></h3><ol><li><p>创建一个目录用来存放检出得到的文件,例如 MyCRM</p></li><li><p>进入目录 MyCRM,点右键</p></li></ol><p><img src="/images/image-20230914200342778.png" alt="image-20230914200342778"></p><p><img src="/images/image-20230914200346501.png" alt="image-20230914200346501"></p><p><img src="/images/image-20230914200350460.png" alt="image-20230914200350460"></p><p>可以看到检出得到的文件</p><p><img src="/images/image-20230914200357123.png" alt="image-20230914200357123"></p><p>此时文件图标上没有任何标识。可能你会想到通过重启电脑的方式解决这一问题——其实不用这么麻烦。文件图标是受外壳程序控制的,我们只需要重启外壳程序——explorer.exe 就可以了。打开任务管理器,选中 explorer.exe 进程,结束进程,然后新建进程 explorer.exe 就可以了</p><p><img src="/images/image-20230914200405733.png" alt="image-20230914200405733"></p><p><img src="/images/image-20230914200411884.png" alt="image-20230914200411884"></p><p><img src="/images/image-20230914200416281.png" alt="image-20230914200416281"></p><p>如果一切顺利的话,你会看到文件图标变成了这样:</p><p><img src="/images/image-20230914200423414.png" alt="image-20230914200423414"></p><h3 id="tortoisesvn-图标含义" tabindex="-1">TortoiseSVN 图标含义 <a class="header-anchor" href="#tortoisesvn-图标含义" aria-label="Permalink to "TortoiseSVN 图标含义""></a></h3><p><img src="/images/image-20230914200435404.png" alt="image-20230914200435404"></p><p>●图标 1:<img src="/images/image-20230914200456681.png" alt="image-20230914200456681"></p><p>一个新检出的工作副本使用绿色的对勾做重载。表示 Subversion 状态正常。</p><p>●图标 2:<img src="/images/image-20230914200524694.png" alt="image-20230914200524694"></p><p>在你开始编辑一个文件后,状态就变成了已修改,而图标重载变成了红色感叹号。通过这种方式,你可以很容易地看出哪些文件从你上次更新工作副本后被修改过,需要被提交。</p><p>●图标 3:<img src="/images/image-20230914200528889.png" alt="image-20230914200528889"></p><p>如果在更新的过程中出现了冲突,图标会变成黄色感叹号。</p><p>●图标 4:<img src="/images/image-20230914200533433.png" alt="image-20230914200533433"></p><p>如果你给一个文件设置了 svn:needs-lock 属性,Subversion 会让此文件只读,直到你获得文件锁。具有这个重载图标的文件来表示你必须在编辑之前先得到锁。</p><p>●图标 5:<img src="/images/image-20230914200543426.png" alt="image-20230914200543426"></p><p>如果你拥有了一个文件的锁,并且 Subversion 状态是正常,这个重载图标就提醒你如果不使用该文件的话应该释放锁,允许别人提交对该文件的修改。</p><p>●图标 6:<img src="/images/image-20230914200547050.png" alt="image-20230914200547050"></p><p>这个图标表示当前文件夹下的某些文件或文件夹已经被调度从版本控制中删除,或是该文件夹下某个受版本控制的文件丢失了。</p><p>●图标 7:<img src="/images/image-20230914200551416.png" alt="image-20230914200551416"></p><p>加号告诉你有一个文件或目录已经被调度加入版本控制。</p><p>●图标 8:<img src="/images/image-20230914200605602.png" alt="image-20230914200605602"></p><p>横条告诉你有一个文件或目录被版本控制系统所忽略。这个图标重载是可选的。</p><p>●图标 9:<img src="/images/image-20230914200609254.png" alt="image-20230914200609254"></p><p>这个图标说明文件和目录未被版本控制,但是也没有被忽略。这个图标重载是可选的</p><h3 id="纳入版本控制" tabindex="-1">纳入版本控制 <a class="header-anchor" href="#纳入版本控制" aria-label="Permalink to "纳入版本控制""></a></h3><ol><li><p>新建文件 abc.txt</p></li><li><p>在文件上点右键</p></li></ol><p><img src="/images/image-20230914200705408.png" alt="image-20230914200705408"></p><p>添加后文件图标发生变化</p><p><img src="/images/image-20230914200711786.png" alt="image-20230914200711786"></p><h3 id="提交-2" tabindex="-1">提交 <a class="header-anchor" href="#提交-2" aria-label="Permalink to "提交""></a></h3><p>①使用 TortoiseSVN 可以提交具体某一个文件,或某一个目录下的所有改变。方法就是在想要提交的项目下点右键,然后 SVN Commit...,就可以看到如下界面</p><p><img src="/images/image-20230914200718622.png" alt="image-20230914200718622"></p><p>②日志内容如果不填,TortoiseSVN 会提交一个空字符串作为日志信息。</p><p>③提交后显示信息如下</p><p><img src="/images/image-20230914200727027.png" alt="image-20230914200727027"></p><p>④没有纳入版本控制的文件默认是不在提交范围内的,直接在新创建的文件上点右键只能看到 add 操作的选项,如前所述。但在新创建的文件所在目录点右键选择 SVN commit...,可以看到如下界面</p><p><img src="/images/image-20230914200734942.png" alt="image-20230914200734942"></p><p>将文件 newFile.txt 选中</p><p><img src="/images/image-20230914200745115.png" alt="image-20230914200745115"></p><p>同样可以提交文件,TortoiseSVN 会帮我们自动将 newFile.txt 纳入版本控制</p><p><img src="/images/image-20230914200752759.png" alt="image-20230914200752759"></p><h3 id="更新-2" tabindex="-1">更新 <a class="header-anchor" href="#更新-2" aria-label="Permalink to "更新""></a></h3><p>在要更新的文件或目录上点右键→SVN Update</p><p><img src="/images/image-20230914200759322.png" alt="image-20230914200759322"></p><h3 id="回复历史版本" tabindex="-1">回复历史版本 <a class="header-anchor" href="#回复历史版本" aria-label="Permalink to "回复历史版本""></a></h3><p>①查看历史版本内容</p><p>[1]首先需要把对应版本库的匿名访问权限设置为 none:anon-access = none</p><p>[2]在要查看历史版本的文件上点右键→TortoiseSVN→Show log</p><p><img src="/images/image-20230914200807197.png" alt="image-20230914200807197"></p><p>[3]在感兴趣的历史版本上点右键,可以与当前工作副本进行比较,或直接打开。</p><p><img src="/images/image-20230914200814848.png" alt="image-20230914200814848"></p><p>②在要回复历史版本的文件上点右键→Update to revision</p><p><img src="/images/image-20230914200824320.png" alt="image-20230914200824320"></p><p>填上想要回到的版本即可</p><p><img src="/images/image-20230914200834555.png" alt="image-20230914200834555"></p><h3 id="解决冲突-1" tabindex="-1">解决冲突 <a class="header-anchor" href="#解决冲突-1" aria-label="Permalink to "解决冲突""></a></h3><p>①文件发生冲突时的状态和在 Eclipse 中一样,这里就不赘述了。</p><p>②在冲突的文件上点右键→Edit Conflicts</p><p><img src="/images/image-20230914200842239.png" alt="image-20230914200842239"></p><p>③有“叹号”的行是发生冲突的行</p><p><img src="/images/image-20230914200850072.png" alt="image-20230914200850072"></p><p>④在冲突行点右键</p><p><img src="/images/image-20230914200856704.png" alt="image-20230914200856704"></p><p>可以选择四种操作:</p><p>[1]使用我的</p><p>[2]使用他们的</p><p>[3]把我的放在他们的前面</p><p>[4]把他们的放在我的前面</p><p>⑤在冲突解决后,直接保存——这时 TortoiseSVN 自动弹出如下确认界面</p><p><img src="/images/image-20230914200905304.png" alt="image-20230914200905304"></p><p>⑥文件变为红色叹号标志,自动生成的三个文件被删除。提交修改即可。</p><h2 id="企业svn版本管理与大型代码上线发布架构方案" tabindex="-1">企业SVN版本管理与大型代码上线发布架构方案 <a class="header-anchor" href="#企业svn版本管理与大型代码上线发布架构方案" aria-label="Permalink to "企业SVN版本管理与大型代码上线发布架构方案""></a></h2><h3 id="一、小型公司代码上线案例-20台服务器以下" tabindex="-1">一、小型公司代码上线案例(20台服务器以下) <a class="header-anchor" href="#一、小型公司代码上线案例-20台服务器以下" aria-label="Permalink to "一、小型公司代码上线案例(20台服务器以下)""></a></h3><p><img src="/images/image-20230914200929945.png" alt="image-20230914200929945"></p><p>特点与问题:</p><ol><li>发布快,及时,随时随地就可以发布代码。</li><li>开发人员发布的代码不经过测试人员的测试,且用户访问页面刷新后页面即改变,也可能刷新瞬间程序在更新,到时无法访问,对网站用户的体验比较差,如果开发写错了代码,造成的影响就更大了,这是拿用户作为测试的上线方案。</li><li>据统计,网站中大概50%以上的故障是和开发程序代码有关的,(比如:开发写错了一个循环代码,导致了死循环,此时大量用户访问这个程序,就能把服务器资源耗尽,搞死服务器)</li><li>在中小公司网站出了问题一般是运维人员的问题(例如网站宕机),但这种情况下,问题大多可能由开发人员或代码引起的,这里比较好的策略是开发项目负责制思想</li></ol><h3 id="二、中型企业上线解决方案" tabindex="-1">二、中型企业上线解决方案 <a class="header-anchor" href="#二、中型企业上线解决方案" aria-label="Permalink to "二、中型企业上线解决方案""></a></h3><p><img src="/images/image-20230914200939261.png" alt="image-20230914200939261"></p><p>规范运维人员操作步聚,制这统一操作脚本,备份文件名称,备份文件路径。使操作人性化,统一化.</p><h3 id="三、大型公司解决上线方案" tabindex="-1">三、大型公司解决上线方案 <a class="header-anchor" href="#三、大型公司解决上线方案" aria-label="Permalink to "三、大型公司解决上线方案""></a></h3><p><img src="/images/image-20230914200948501.png" alt="image-20230914200948501"></p><ol><li>特别是JAVA代码环境,上线时,有数台机器同时需要更新:</li></ol><p>1).本地开发人员取svn代码。当天上线提交到trunk,否则,长期项目单开分支开发,然后在合并主线(trunk)</p><p>2).办公内网开发测试时,由开发人员或配置人员通过部署平台jenkins实现统一部署,(即在部署平台上控制开发机器从svn取代码,编译,打包,发布到开发机包如id_dep.war).</p><p>3).开发人员通知测试人员或一起测试,没有问题后,打上tag标记。</p><p>4).配置管管理员,根据上步的tag标记,checkout出代码,并配置好IDC测试环境的所有配置,执行编译,打包(mvn,ant)(php不需要),然后发布到IDC内统一分发服务器。</p><p>5).配置管理员或SA上线人员,把分发的内容推送到相关测试服务器(报名如id_test.war),然后通知开发及测试人员进行测试。如果有问题向上回退。</p><p>6).如果没有问题,继续打好tag,此时,配置上步tag标记,checkout出代码,并配置好IDC环境所有的配置,执行编译,打包(mvn,ant)(php不需要),然后发布到IDC内统一分发服务器。</p><p>7).配置管理员或SA上线人员,把分发的内容推送到相关正式服务器(报名idc_product.war),然后通知开发及测试人员进行测试。如果没有问题直接发布回滚指令。</p><p>IDC正式上线的过程对于JAVA程序,可以是AB组分组上线的思路,即平滑下线一半的服务器,然后发布更新代码测试,无问题后,挂上服务器,同时在平滑下线另一半的服务器,然后发布更新代码测试(或者直接发布后就挂上线)</p><ul><li><p>对于PHP上线方法:发布时可以用发布到正式线临时目录 ,然后mv或更改link的方式发布到正式上线目录 ,不需要重启</p></li><li><p>对于java上线方法:需要分组平滑下上线(如从负载均衡上摘掉部分服务器),发布代码后,重启服务器测试</p></li></ul><p>2、上线解决方案注意事项</p><p>1).办公室测试环境--IDC测试环境---正式生产环境,所有软件均应版本统一(如:操作系统,web服务器,jdk,php,tomcat,resin等版本)</p><p>2).开发团队小组测试环境测试(该测试环境属于开发小组),有问题返回给某开发人员重新开发。</p><p>3).有专门的测试工程师,程序有问题直接返回给开发人员(此时返回的一般为程序的BUG,称为BUG库),无问题进行IDCi测试</p><p>4).IDC测试由测试人员和运维人员参与,叫IDCtest,进行程序的压力测试,有问题直接返回给开发人员,无问题进行线上环境上线</p><p>5).数台服务器代码分发上线方案举例(JAVA程序)</p><ul><li><p>A:假设同业务服务器有6台,将服务器分为A,B两组,A组三台,B组三台,先对A组进行从负载均衡器上平滑下线,B组正常提供服务,避免服务器因上线影响业务。</p></li><li><p>B:下线过程是通过脚本将A组服务器从RS池(LVS,NGINX,HAPROXY,F5等均有平滑方案)中踢出,避免负裁均衡器将请求发送给A组服务器(此时的时间应该为网站流量少时,一般为晚上)</p></li><li><p>C:将代码分发到A组服务器的站点目录下,对A组服务器上线并重启服务,并由专业的测试人员进行访问测试,测试成功后,挂上A组的服务器,同时下线B组服务器,B组代码上线操作测试等和A组相同</p></li></ul><p>6).特别说明:如果PHP程序,则上线可以简单化,直接将上线代码(最好全量)发布到所有上线服务器的特定目录后,分发完成后,一次性mv或ln到站点目录,当然测试是少不了的。</p><p>7).大多数门户的前端页面都已经静态或者cache了,因上经动态的部分访问平时就不会特别多</p><h3 id="sina上线方案" tabindex="-1">sina上线方案 <a class="header-anchor" href="#sina上线方案" aria-label="Permalink to "sina上线方案""></a></h3><p><img src="/images/image-20230914201016037.png" alt="image-20230914201016037"></p></div></div></main><footer class="VPDocFooter" data-v-e970bbc0 data-v-45cfeac9><!--[--><!--]--><!----><nav class="prev-next" data-v-45cfeac9><div class="pager" data-v-45cfeac9><!----></div><div class="pager" data-v-45cfeac9><a class="pager-link next" href="/tools-soft-baidupan.html" data-v-45cfeac9><span class="desc" data-v-45cfeac9>下一篇</span><span class="title" data-v-45cfeac9>百度网盘</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"lang-java.md\":\"9fff46e5\",\"api-examples.md\":\"0c7bbd41\",\"lang-java-array.md\":\"9c8e9312\",\"lang-java-base.md\":\"020e1eda\",\"tools-soft-7zip.md\":\"d1e14adf\",\"tools-soft.md\":\"9c9a88a3\",\"tools-soft-windows.md\":\"70dfbaa0\",\"tools-soft-markdown.md\":\"6c5314cd\",\"docs_05_devops_01_部署_06_linux_04_linux安装.md\":\"9068ebd9\",\"tools-soft-chrome.md\":\"785c1b29\",\"tools-soft-baidupan.md\":\"d651616f\",\"tools-soft-foxit.md\":\"6d3da41e\",\"tools-soft-cmder.md\":\"b39aed2e\",\"docs_05_devops_01_部署_06_linux_01_linux概述.md\":\"83e5c414\",\"docs_05_devops_01_部署_06_linux_02_linux常用命令.md\":\"f6f08dad\",\"tools-soft-office.md\":\"0dfaede5\",\"tools-soft-potplayer.md\":\"2344cea6\",\"tools-soft-snipaste.md\":\"b65c8145\",\"tools-soft-sublimetext.md\":\"c02c7aaf\",\"tools-soft-typora.md\":\"7c7a2879\",\"tools-soft-tizi.md\":\"70132fe0\",\"tools-soft-xmind.md\":\"165042c6\",\"tools-dev-maven.md\":\"e0a81f73\",\"tools-dev-idea.md\":\"a7daced8\",\"tools-dev-pycharm.md\":\"a24889ff\",\"tools-dev-navicat.md\":\"aad3f952\",\"tools-dev-gradle.md\":\"f91af374\",\"tools-dev-ssh.md\":\"eafa7684\",\"tools-dev-postman.md\":\"4505be9e\",\"tools-dev-jmeter.md\":\"540d7cde\",\"index.md\":\"5d013929\",\"tools-vcs-svn.md\":\"cba08751\",\"tools-vcs-git.md\":\"f375211f\",\"docs_05_devops_01_部署_06_linux_03_linux下shell篇.md\":\"5e45709e\",\"devops-deploy-tomcat.md\":\"53274c1f\",\"devops-deploy-lvs.md\":\"cf468b1a\",\"devops-deploy-nginx.md\":\"775aaeab\",\"tools-dev-vmware.md\":\"7bae1f2d\",\"markdown-examples.md\":\"6e41634c\",\"tools-vcs-gitflow.md\":\"aaed74fe\",\"tools-dev-nvm.md\":\"c458444c\",\"tools-vcs-gitee.md\":\"6c9a7eac\",\"tools-vcs-github.md\":\"632499ef\",\"tools-vcs-gitlib.md\":\"39b34382\",\"tools-soft-nodepad.md\":\"3760c1d7\",\"tools-vcs-gogs.md\":\"13159221\",\"tools-soft-evernote.md\":\"83c52166\",\"tools-vcs.md\":\"9f934182\",\"tools-soft-calibre.md\":\"70835893\",\"devops-deploy-shell.md\":\"977c5588\",\"tools-dev-vscode.md\":\"560399f9\",\"devops-deploy-openresty.md\":\"316dd579\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"Coder\",\"titleTemplate\":\"广度和深度\",\"description\":\"整理和记录代码学习的笔记\",\"base\":\"/\",\"head\":[],\"appearance\":\"dark\",\"themeConfig\":{\"logo\":\"./logo.jpg\",\"siteTitle\":\"Coder\",\"outline\":[2,3],\"outlineTitle\":\"目录\",\"search\":{\"provider\":\"local\"},\"darkModeSwitchLabel\":\"深浅模式\",\"sidebarMenuLabel\":\"菜单\",\"returnToTopLabel\":\"返回顶部\",\"lastUpdatedText\":\"上次更新\",\"docFooter\":{\"prev\":\"上一篇\",\"next\":\"下一篇\"},\"nav\":[{\"text\":\"♎语言\",\"items\":[{\"text\":\"1️⃣ Java\",\"link\":\"lang-java\"},{\"text\":\"2️⃣ Python\",\"link\":\"lang-python\"},{\"text\":\"3️⃣ Scala\",\"link\":\"lang-scala\"},{\"text\":\"4️⃣ Groovy\",\"link\":\"lang-groovy\"}]},{\"text\":\"☯️算法\",\"items\":[{\"text\":\"算法篇\",\"items\":[{\"text\":\"🚫代码规范\",\"link\":\"/#\"},{\"text\":\"🚫设计模式\",\"link\":\"/#\"},{\"text\":\"🚫数据结构\",\"link\":\"/#\"},{\"text\":\"🚫源码解读\",\"link\":\"/#\"}]},{\"text\":\"并发篇\",\"items\":[{\"text\":\"🚫JVM\",\"link\":\"/#\"},{\"text\":\"🚫并发编程\",\"link\":\"/#\"}]},{\"text\":\"设计篇\",\"items\":[{\"text\":\"🚫系统设计\",\"link\":\"/#\"},{\"text\":\"🚫数仓理论\",\"link\":\"/#\"}]},{\"text\":\"职业篇\",\"items\":[{\"text\":\"🚫方向导航\",\"link\":\"/#\"},{\"text\":\"🚫职业规划\",\"link\":\"/#\"},{\"text\":\"🚫面试准备\",\"link\":\"/#\"}]}]},{\"text\":\"♈前端\",\"items\":[{\"text\":\"🚫HTML\",\"link\":\"/#\"},{\"text\":\"🚫CSS\",\"link\":\"/#\"},{\"text\":\"🚫JavaScript\",\"link\":\"/#\"},{\"text\":\"🚫JQuery\",\"link\":\"/#\"},{\"text\":\"🚫NodeJS\",\"link\":\"/#\"},{\"text\":\"🚫Vue\",\"link\":\"/#\"},{\"text\":\"🚫React\",\"link\":\"/#\"},{\"text\":\"🚫小程序\",\"link\":\"/#\"}]},{\"text\":\"🔯微服务\",\"items\":[{\"text\":\"🚫RPC\",\"link\":\"/#\"},{\"text\":\"🚫Spring\",\"link\":\"/#\"},{\"text\":\"🚫Spring MVC\",\"link\":\"/#\"},{\"text\":\"🚫Spring Boot\",\"link\":\"/#\"},{\"text\":\"🚫Spring Cloud\",\"link\":\"/#\"},{\"text\":\"🚫Spring Cloud Alibaba\",\"link\":\"/#\"},{\"text\":\"🚫Service Mesh\",\"link\":\"/#\"}]},{\"text\":\"⚧️数据存储\",\"items\":[{\"text\":\"SQL数据库\",\"items\":[{\"text\":\"🚫MySQL\",\"link\":\"/#\"},{\"text\":\"🚫Oracle\",\"link\":\"/#\"}]},{\"text\":\"NoSQL数据库\",\"items\":[{\"text\":\"🚫Redis\",\"link\":\"/#\"},{\"text\":\"🚫MongoDB\",\"link\":\"/#\"}]},{\"text\":\"NewSQL数据库\",\"items\":[{\"text\":\"🚫TiDB\",\"link\":\"/#\"}]},{\"text\":\"ORM框架\",\"items\":[{\"text\":\"🚫Mybatis\",\"link\":\"/#\"},{\"text\":\"🚫Mybatis Plus\",\"link\":\"/#\"},{\"text\":\"🚫Spring Data JPA\",\"link\":\"/#\"}]},{\"text\":\"消息中间件\",\"items\":[{\"text\":\"🚫Active MQ\",\"link\":\"/#\"},{\"text\":\"🚫RabbitMQ\",\"link\":\"/#\"},{\"text\":\"🚫RocketMQ\",\"link\":\"/#\"},{\"text\":\"🚫Kafka\",\"link\":\"/#\"}]},{\"text\":\"文件存储\",\"items\":[{\"text\":\"🚫FastDFS\",\"link\":\"/#\"},{\"text\":\"🚫Ceph\",\"link\":\"/#\"},{\"text\":\"🚫HDFS\",\"link\":\"/#\"}]},{\"text\":\"搜索引擎\",\"items\":[{\"text\":\"🚫Lucene\",\"link\":\"/#\"},{\"text\":\"🚫Solr\",\"link\":\"/#\"},{\"text\":\"🚫ElasticSearch\",\"link\":\"/#\"}]}]},{\"text\":\"☸️DevOps\",\"items\":[{\"text\":\"部署\",\"items\":[{\"text\":\"Tomcat\",\"link\":\"devops-deploy-tomcat\"},{\"text\":\"🚫Linux\",\"link\":\"devops-deploy-tomcat\"},{\"text\":\"Shell\",\"link\":\"devops-deploy-shell\"},{\"text\":\"🚫Nginx\",\"link\":\"devops-deploy-tomcat\"},{\"text\":\"🚫Linux\",\"link\":\"devops-deploy-tomcat\"},{\"text\":\"🚫LVS+Keepalived\",\"link\":\"devops-deploy-tomcat\"},{\"text\":\"🚫OpenResty+Kong\",\"link\":\"devops-deploy-tomcat\"}]},{\"text\":\"容器\",\"items\":[{\"text\":\"🚫Docker\",\"link\":\"/#\"},{\"text\":\"🚫Kubernates\",\"link\":\"/#\"}]},{\"text\":\"云服务器\",\"items\":[{\"text\":\"🚫IaaS\",\"link\":\"/#\"},{\"text\":\"🚫UCloud\",\"link\":\"/#\"}]},{\"text\":\"持续集成\",\"items\":[{\"text\":\"🚫Jenkins\",\"link\":\"/#\"}]},{\"text\":\"监控工具\",\"items\":[{\"text\":\"🚫Arthas\",\"link\":\"/#\"},{\"text\":\"🚫Zabbix\",\"link\":\"/#\"}]},{\"text\":\"链路追踪\",\"items\":[{\"text\":\"🚫Sleuth+Zipkin\",\"link\":\"/#\"},{\"text\":\"🚫Skywalking\",\"link\":\"/#\"}]},{\"text\":\"性能压测\",\"items\":[{\"text\":\"🚫JMeter\",\"link\":\"/#\"},{\"text\":\"🚫全链路压测\",\"link\":\"/#\"}]}]},{\"text\":\"✝️工具\",\"items\":[{\"text\":\"软性办公工具\",\"link\":\"tools-soft\"},{\"text\":\"版本控制工具\",\"link\":\"tools-vcs\"},{\"text\":\"包管理工具\",\"link\":\"tools-dev\"},{\"text\":\"项目构建工具\",\"link\":\"tools-dev\"},{\"text\":\"编程工具\",\"link\":\"tools-dev\"},{\"text\":\"数据库管理\",\"link\":\"tools-dev\"},{\"text\":\"虚拟机工具\",\"link\":\"tools-dev\"},{\"text\":\"SSH工具\",\"link\":\"tools-dev\"},{\"text\":\"调试工具\",\"link\":\"tools-dev\"},{\"text\":\"压测工具\",\"link\":\"tools-dev\"}]}],\"sidebar\":{\"lang-java\":[{\"text\":\"01_Java\",\"collapsed\":false,\"base\":\"lang-java-\",\"items\":[{\"text\":\"基础语法\",\"link\":\"base.md\"},{\"text\":\"数组\",\"collapsed\":true,\"items\":[{\"text\":\"数组入门\",\"link\":\"02_数组.md\"},{\"text\":\"数组进阶\",\"link\":\"02_数组.md\"},{\"text\":\"数组高级\",\"link\":\"02_数组.md\"}]}]}],\"devops\":[{\"text\":\"部署\",\"collapsed\":true,\"base\":\"devops-deploy-\",\"items\":[{\"text\":\"Tomcat\",\"link\":\"tomcat.md\"},{\"text\":\"Shell\",\"link\":\"shell.md\"},{\"text\":\"LVS\",\"link\":\"lvs.md\"},{\"text\":\"Nginx\",\"link\":\"nginx.md\"},{\"text\":\"OpenResty\",\"link\":\"openresty.md\"},{\"text\":\"Evernote\",\"link\":\"evernote.md\"}]}],\"tools\":[{\"text\":\"软性办公\",\"collapsed\":true,\"base\":\"tools-soft-\",\"items\":[{\"text\":\"百度网盘\",\"link\":\"baidupan.md\"},{\"text\":\"福昕阅读器\",\"link\":\"foxit.md\"},{\"text\":\"Calibre\",\"link\":\"calibre.md\"},{\"text\":\"Chrome\",\"link\":\"chrome.md\"},{\"text\":\"Cmder\",\"link\":\"cmder.md\"},{\"text\":\"Evernote\",\"link\":\"evernote.md\"},{\"text\":\"Nodepad\",\"link\":\"nodepad.md\"},{\"text\":\"Office\",\"link\":\"office.md\"},{\"text\":\"PotPlayer\",\"link\":\"potplayer.md\"},{\"text\":\"Snipaste\",\"link\":\"snipaste.md\"},{\"text\":\"SublimeText\",\"link\":\"sublimetext.md\"},{\"text\":\"Typora\",\"link\":\"typora.md\"},{\"text\":\"科学上网\",\"link\":\"tizi.md\"},{\"text\":\"Xmind\",\"link\":\"xmind.md\"},{\"text\":\"7zip\",\"link\":\"7zip.md\"},{\"text\":\"Windows\",\"link\":\"windows.md\"},{\"text\":\"Markdown\",\"link\":\"markdown.md\"}]},{\"text\":\"版本管理\",\"collapsed\":true,\"base\":\"tools-vcs-\",\"items\":[{\"text\":\"Git\",\"collapsed\":true,\"items\":[{\"text\":\"Git\",\"link\":\"git.md\"},{\"text\":\"Gogs\",\"link\":\"gogs.md\"},{\"text\":\"Gitee\",\"link\":\"gitee.md\"},{\"text\":\"Github\",\"link\":\"github.md\"},{\"text\":\"GitLib\",\"link\":\"gitlib.md\"},{\"text\":\"GitFlow\",\"link\":\"gitflow.md\"}]},{\"text\":\"Svn\",\"link\":\"svn.md\"}]},{\"text\":\"包管理工具\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"NVM\",\"link\":\"nvm.md\"}]},{\"text\":\"项目构建\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"Maven\",\"link\":\"maven.md\"},{\"text\":\"Gradle\",\"link\":\"gradle.md\"}]},{\"text\":\"编程工具\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"IDEA\",\"link\":\"idea.md\"},{\"text\":\"VsCode\",\"link\":\"vscode.md\"},{\"text\":\"PyCharm\",\"link\":\"pycharm.md\"}]},{\"text\":\"数据库管理\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"Navicat\",\"link\":\"navicat.md\"}]},{\"text\":\"虚拟机工具\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"VMware\",\"link\":\"vmware.md\"}]},{\"text\":\"SSH工具\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"SSH工具\",\"link\":\"ssh.md\"}]},{\"text\":\"调试工具\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"Postman\",\"link\":\"postman.md\"}]},{\"text\":\"压测工具\",\"collapsed\":true,\"base\":\"tools-dev-\",\"items\":[{\"text\":\"JMeter\",\"link\":\"jmeter.md\"}]}]}},\"locales\":{},\"scrollOffset\":90,\"cleanUrls\":false}");</script>
</body>
</html>