格式化 markdown 文档
parent
9d24cbf0a4
commit
87a1df9593
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
Docker 使用 C/S 体系结构。Docker 守护进程,负责构建、运行和分发 Docker 容器;Docker 客户端与 Docker 守护进程通信。Docker 客户端和守护进程可以在同一个系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API,并通过 UNIX 套接字或网络接口进行通信。
|
Docker 使用 C/S 体系结构。Docker 守护进程,负责构建、运行和分发 Docker 容器;Docker 客户端与 Docker 守护进程通信。Docker 客户端和守护进程可以在同一个系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API,并通过 UNIX 套接字或网络接口进行通信。
|
||||||
|
|
||||||
![https://docs.docker.com/engine/images/architecture.svg](https://docs.docker.com/engine/images/architecture.svg)
|
<br><div align="center"><img src="https://docs.docker.com/engine/images/architecture.svg"/></div><br>
|
||||||
|
|
||||||
### Docker 守护进程(docker daemon)
|
### Docker 守护进程(docker daemon)
|
||||||
|
|
||||||
|
|
|
@ -20,4 +20,4 @@ docker rm $(docker ps -a -q)
|
||||||
|
|
||||||
```
|
```
|
||||||
docker rmi $(docker images -q)
|
docker rmi $(docker images -q)
|
||||||
```
|
```
|
||||||
|
|
|
@ -68,4 +68,4 @@ CONTAINER ID IMAGE COMMAND CREATED
|
||||||
a661d957c6fa hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago mystifying_swartz
|
a661d957c6fa hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago mystifying_swartz
|
||||||
3098f24a1064 docker.io/hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago sad_yonath
|
3098f24a1064 docker.io/hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago sad_yonath
|
||||||
4c98c4f18a39 hello-world "/hello" 8 minutes ago Exited (0) 8 minutes ago admiring_banach
|
4c98c4f18a39 hello-world "/hello" 8 minutes ago Exited (0) 8 minutes ago admiring_banach
|
||||||
```
|
```
|
||||||
|
|
|
@ -33,4 +33,4 @@ services:
|
||||||
- webnet
|
- webnet
|
||||||
networks:
|
networks:
|
||||||
webnet:
|
webnet:
|
||||||
```
|
```
|
||||||
|
|
|
@ -32,7 +32,7 @@ REST API 指定程序可用于与守护进程进行通信并指示其执行操
|
||||||
|
|
||||||
命令行客户端。
|
命令行客户端。
|
||||||
|
|
||||||
![https://docs.docker.com/engine/images/engine-components-flow.png](https://docs.docker.com/engine/images/engine-components-flow.png)
|
<br><div align="center"><img src="https://docs.docker.com/engine/images/engine-components-flow.png"/></div><br>
|
||||||
|
|
||||||
CLI 使用 Docker REST API 通过脚本或直接 CLI 命令来控制 Docker 守护进程或与其进行交互。许多其他 Docker 应用程序使用底层的 API 和 CLI。
|
CLI 使用 Docker REST API 通过脚本或直接 CLI 命令来控制 Docker 守护进程或与其进行交互。许多其他 Docker 应用程序使用底层的 API 和 CLI。
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ CLI 使用 Docker REST API 通过脚本或直接 CLI 命令来控制 Docker 守
|
||||||
|
|
||||||
### 传统虚拟机和 Docker
|
### 传统虚拟机和 Docker
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/docker/containers-and-vm.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/docker/containers-and-vm.png"/></div><br>
|
||||||
|
|
||||||
## 概念
|
## 概念
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
>
|
>
|
||||||
> Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
|
> Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/docker/containers-and-vm.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/docker/containers-and-vm.png"/></div><br>
|
||||||
|
|
||||||
## [入门篇](docker-quickstart.md)
|
## [入门篇](docker-quickstart.md)
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容
|
||||||
- Volume
|
- Volume
|
||||||
- Namespace
|
- Namespace
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/kubernetes/pod.svg)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/kubernetes/pod.svg"/></div><br>
|
||||||
|
|
||||||
高级对象
|
高级对象
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ tags:
|
||||||
|
|
||||||
linux 目录结构是树形结构,其根目录是 `/` 。一张思维导图说明各个目录的作用:
|
linux 目录结构是树形结构,其根目录是 `/` 。一张思维导图说明各个目录的作用:
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/linux/linux-folders.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/linux/linux-folders.png"/></div><br>
|
||||||
|
|
||||||
### Linux 文件属性
|
### Linux 文件属性
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
|
||||||
|
|
||||||
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
|
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180927171909.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920180927171909.png"/></div><br>
|
||||||
|
|
||||||
从左至右用 0-9 这些数字来表示。
|
从左至右用 0-9 这些数字来表示。
|
||||||
|
|
||||||
|
@ -466,7 +466,7 @@ scp -r test root@192.168.0.1:/opt
|
||||||
ssh-keygen -t rsa
|
ssh-keygen -t rsa
|
||||||
```
|
```
|
||||||
|
|
||||||
(2)将服务器 A 的 `~/.ssh/id_rsa.pub` 文件内容复制到服务器 B 的 `~/.ssh/authorized_keys` 文件中。
|
(2)将服务器 A 的 `\~/.ssh/id_rsa.pub` 文件内容复制到服务器 B 的 `\~/.ssh/authorized_keys` 文件中。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 服务器 A 上执行以下命令
|
# 服务器 A 上执行以下命令
|
||||||
|
|
|
@ -290,30 +290,30 @@ kill 3268
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# 1.启动 nfs 服务
|
# 1.启动 nfs 服务
|
||||||
systemctl start nfs-server.service
|
systemctl start nfs-server.service
|
||||||
|
|
||||||
# 2.设置开机自启动
|
# 2.设置开机自启动
|
||||||
systemctl enable nfs-server.service
|
systemctl enable nfs-server.service
|
||||||
|
|
||||||
# 3.停止开机自启动
|
# 3.停止开机自启动
|
||||||
systemctl disable nfs-server.service
|
systemctl disable nfs-server.service
|
||||||
|
|
||||||
# 4.查看服务当前状态
|
# 4.查看服务当前状态
|
||||||
systemctl status nfs-server.service
|
systemctl status nfs-server.service
|
||||||
|
|
||||||
# 5.重新启动某服务
|
# 5.重新启动某服务
|
||||||
systemctl restart nfs-server.service
|
systemctl restart nfs-server.service
|
||||||
|
|
||||||
# 6.查看所有已启动的服务
|
# 6.查看所有已启动的服务
|
||||||
systemctl list -units --type=service
|
systemctl list -units --type=service
|
||||||
|
|
||||||
# 7. 开启防火墙 22 端口
|
# 7. 开启防火墙 22 端口
|
||||||
iptables -I INPUT -p tcp --dport 22 -j accept
|
iptables -I INPUT -p tcp --dport 22 -j accept
|
||||||
|
|
||||||
# 8. 彻底关闭防火墙
|
# 8. 彻底关闭防火墙
|
||||||
sudo systemctl status firewalld.service
|
sudo systemctl status firewalld.service
|
||||||
sudo systemctl stop firewalld.service
|
sudo systemctl stop firewalld.service
|
||||||
sudo systemctl disable firewalld.service
|
sudo systemctl disable firewalld.service
|
||||||
```
|
```
|
||||||
|
|
||||||
### service
|
### service
|
||||||
|
@ -366,16 +366,16 @@ service network restart
|
||||||
# 每晚的 21:30 重启 smb
|
# 每晚的 21:30 重启 smb
|
||||||
30 21 * * * /etc/init.d/smb restart
|
30 21 * * * /etc/init.d/smb restart
|
||||||
|
|
||||||
# 每月 1、10、22 日的 4 : 45 重启 smb
|
# 每月 1、10、22 日的 4 : 45 重启 smb
|
||||||
45 4 1,10,22 * * /etc/init.d/smb restart
|
45 4 1,10,22 * * /etc/init.d/smb restart
|
||||||
|
|
||||||
# 每周六、周日的 1:10 重启 smb
|
# 每周六、周日的 1:10 重启 smb
|
||||||
10 1 * * 6,0 /etc/init.d/smb restart
|
10 1 * * 6,0 /etc/init.d/smb restart
|
||||||
|
|
||||||
# 每天 18 : 00 至 23 : 00 之间每隔 30 分钟重启 smb
|
# 每天 18 : 00 至 23 : 00 之间每隔 30 分钟重启 smb
|
||||||
0,30 18-23 * * * /etc/init.d/smb restart
|
0,30 18-23 * * * /etc/init.d/smb restart
|
||||||
|
|
||||||
# 每星期六的晚上 11:00 pm 重启 smb
|
# 每星期六的晚上 11:00 pm 重启 smb
|
||||||
0 23 * * 6 /etc/init.d/smb restart
|
0 23 * * 6 /etc/init.d/smb restart
|
||||||
|
|
||||||
# 每一小时重启 smb
|
# 每一小时重启 smb
|
||||||
|
|
|
@ -190,13 +190,13 @@ lo Link encap:Local Loopback
|
||||||
# 查看当前路由
|
# 查看当前路由
|
||||||
route
|
route
|
||||||
Kernel IP routing table
|
Kernel IP routing table
|
||||||
Destination Gateway Genmask Flags Metric Ref Use Iface
|
Destination Gateway Genmask Flags Metric Ref Use Iface
|
||||||
112.124.12.0 * 255.255.252.0 U 0 0 0 eth1
|
112.124.12.0 * 255.255.252.0 U 0 0 0 eth1
|
||||||
10.160.0.0 * 255.255.240.0 U 0 0 0 eth0
|
10.160.0.0 * 255.255.240.0 U 0 0 0 eth0
|
||||||
192.168.0.0 10.160.15.247 255.255.0.0 UG 0 0 0 eth0
|
192.168.0.0 10.160.15.247 255.255.0.0 UG 0 0 0 eth0
|
||||||
172.16.0.0 10.160.15.247 255.240.0.0 UG 0 0 0 eth0
|
172.16.0.0 10.160.15.247 255.240.0.0 UG 0 0 0 eth0
|
||||||
10.0.0.0 10.160.15.247 255.0.0.0 UG 0 0 0 eth0
|
10.0.0.0 10.160.15.247 255.0.0.0 UG 0 0 0 eth0
|
||||||
default 112.124.15.247 0.0.0.0 UG 0 0 0 eth1
|
default 112.124.15.247 0.0.0.0 UG 0 0 0 eth1
|
||||||
|
|
||||||
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 # 添加网关/设置网关
|
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 # 添加网关/设置网关
|
||||||
route add -net 224.0.0.0 netmask 240.0.0.0 reject # 屏蔽一条路由
|
route add -net 224.0.0.0 netmask 240.0.0.0 reject # 屏蔽一条路由
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
# 命令行的艺术
|
# 命令行的艺术
|
||||||
|
|
||||||
[![Join the chat at https://gitter.im/jlevy/the-art-of-command-line](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jlevy/the-art-of-command-line?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
<br><div align="center"><img src="https://gitter.im/jlevy/the-art-of-command-line?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"/></div><br>
|
||||||
|
|
||||||
- [前言](#前言)
|
- [前言](#前言)
|
||||||
- [基础](#基础)
|
- [基础](#基础)
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
- [免责声明](#免责声明)
|
- [免责声明](#免责声明)
|
||||||
|
|
||||||
|
|
||||||
![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/cowsay.png)
|
<br><div align="center"><img src="https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/cowsay.png"/></div><br>
|
||||||
|
|
||||||
熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。
|
熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@
|
||||||
|
|
||||||
- 键入 `history` 查看命令行历史记录,再用 `!n`(`n` 是命令编号)就可以再次执行。其中有许多缩写,最有用的大概就是 `!$`, 它用于指代上次键入的参数,而 `!!` 可以指代上次键入的命令了(参考 man 页面中的“HISTORY EXPANSION”)。不过这些功能,你也可以通过快捷键 **ctrl-r** 和 **alt-.** 来实现。
|
- 键入 `history` 查看命令行历史记录,再用 `!n`(`n` 是命令编号)就可以再次执行。其中有许多缩写,最有用的大概就是 `!$`, 它用于指代上次键入的参数,而 `!!` 可以指代上次键入的命令了(参考 man 页面中的“HISTORY EXPANSION”)。不过这些功能,你也可以通过快捷键 **ctrl-r** 和 **alt-.** 来实现。
|
||||||
|
|
||||||
- `cd` 命令可以切换工作路径,输入 `cd ~` 可以进入 home 目录。要访问你的 home 目录中的文件,可以使用前缀 `~`(例如 `~/.bashrc`)。在 `sh` 脚本里则用环境变量 `$HOME` 指代 home 目录的路径。
|
- `cd` 命令可以切换工作路径,输入 `cd \~` 可以进入 home 目录。要访问你的 home 目录中的文件,可以使用前缀 `\~`(例如 `\~/.bashrc`)。在 `sh` 脚本里则用环境变量 `$HOME` 指代 home 目录的路径。
|
||||||
|
|
||||||
- 回到前一个工作路径:`cd -`。
|
- 回到前一个工作路径:`cd -`。
|
||||||
|
|
||||||
|
@ -117,9 +117,9 @@
|
||||||
|
|
||||||
- 使用 `alias` 来创建常用命令的快捷形式。例如:`alias ll='ls -latr'` 创建了一个新的命令别名 `ll`。
|
- 使用 `alias` 来创建常用命令的快捷形式。例如:`alias ll='ls -latr'` 创建了一个新的命令别名 `ll`。
|
||||||
|
|
||||||
- 可以把别名、shell 选项和常用函数保存在 `~/.bashrc`,具体看下这篇[文章](http://superuser.com/a/183980/7106)。这样做的话你就可以在所有 shell 会话中使用你的设定。
|
- 可以把别名、shell 选项和常用函数保存在 `\~/.bashrc`,具体看下这篇[文章](http://superuser.com/a/183980/7106)。这样做的话你就可以在所有 shell 会话中使用你的设定。
|
||||||
|
|
||||||
- 把环境变量的设定以及登陆时要执行的命令保存在 `~/.bash_profile`。而对于从图形界面启动的 shell 和 `cron` 启动的 shell,则需要单独配置文件。
|
- 把环境变量的设定以及登陆时要执行的命令保存在 `\~/.bash_profile`。而对于从图形界面启动的 shell 和 `cron` 启动的 shell,则需要单独配置文件。
|
||||||
|
|
||||||
- 要想在几台电脑中同步你的配置文件(例如 `.bashrc` 和 `.bash_profile`),可以借助 Git。
|
- 要想在几台电脑中同步你的配置文件(例如 `.bashrc` 和 `.bash_profile`),可以借助 Git。
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@
|
||||||
|
|
||||||
- ssh 中,了解如何使用 `-L` 或 `-D`(偶尔需要用 `-R`)开启隧道是非常有用的,比如当你需要从一台远程服务器上访问 web 页面。
|
- ssh 中,了解如何使用 `-L` 或 `-D`(偶尔需要用 `-R`)开启隧道是非常有用的,比如当你需要从一台远程服务器上访问 web 页面。
|
||||||
|
|
||||||
- 对 ssh 设置做一些小优化可能是很有用的,例如这个 `~/.ssh/config` 文件包含了防止特定网络环境下连接断开、压缩数据、多通道等选项:
|
- 对 ssh 设置做一些小优化可能是很有用的,例如这个 `\~/.ssh/config` 文件包含了防止特定网络环境下连接断开、压缩数据、多通道等选项:
|
||||||
```
|
```
|
||||||
TCPKeepAlive=yes
|
TCPKeepAlive=yes
|
||||||
ServerAliveInterval=15
|
ServerAliveInterval=15
|
||||||
|
@ -315,7 +315,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- 用 [`ncdu`](https://dev.yorhel.nl/ncdu) 来查看磁盘使用情况,它比寻常的命令,如 `du -sh *`,更节省时间。
|
- 用 [`ncdu`](https://dev.yorhel.nl/ncdu) 来查看磁盘使用情况,它比寻常的命令,如 `du -sh *`,更节省时间。
|
||||||
|
|
||||||
- 查找正在使用带宽的套接字连接或进程,使用 [`iftop`](http://www.ex-parrot.com/~pdw/iftop/) 或 [`nethogs`](https://github.com/raboof/nethogs)。
|
- 查找正在使用带宽的套接字连接或进程,使用 [`iftop`](http://www.ex-parrot.com/\~pdw/iftop/) 或 [`nethogs`](https://github.com/raboof/nethogs)。
|
||||||
|
|
||||||
- `ab` 工具(Apache 中自带)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 `siege`。
|
- `ab` 工具(Apache 中自带)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 `siege`。
|
||||||
|
|
||||||
|
@ -514,7 +514,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
- [`sar`](http://sebastien.godard.pagesperso-orange.fr/):系统历史数据
|
- [`sar`](http://sebastien.godard.pagesperso-orange.fr/):系统历史数据
|
||||||
|
|
||||||
- [`iftop`](http://www.ex-parrot.com/~pdw/iftop/) 或 [`nethogs`](https://github.com/raboof/nethogs):套接字及进程的网络利用情况
|
- [`iftop`](http://www.ex-parrot.com/\~pdw/iftop/) 或 [`nethogs`](https://github.com/raboof/nethogs):套接字及进程的网络利用情况
|
||||||
|
|
||||||
- `ss`:套接字数据
|
- `ss`:套接字数据
|
||||||
|
|
||||||
|
@ -609,6 +609,6 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
|
||||||
|
|
||||||
## 授权条款
|
## 授权条款
|
||||||
|
|
||||||
[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/)
|
<br><div align="center"><img src="http://creativecommons.org/licenses/by-sa/4.0/"/></div><br>
|
||||||
|
|
||||||
本文使用授权协议 [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)。
|
本文使用授权协议 [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)。
|
||||||
|
|
|
@ -35,12 +35,12 @@ nameserver 8.8.8.8
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 开启防火墙 22 端口
|
# 开启防火墙 22 端口
|
||||||
iptables -I INPUT -p tcp --dport 22 -j accept
|
iptables -I INPUT -p tcp --dport 22 -j accept
|
||||||
|
|
||||||
# 彻底关闭防火墙
|
# 彻底关闭防火墙
|
||||||
sudo systemctl status firewalld.service
|
sudo systemctl status firewalld.service
|
||||||
sudo systemctl stop firewalld.service
|
sudo systemctl stop firewalld.service
|
||||||
sudo systemctl disable firewalld.service
|
sudo systemctl disable firewalld.service
|
||||||
```
|
```
|
||||||
|
|
||||||
## 系统维护
|
## 系统维护
|
||||||
|
|
|
@ -181,7 +181,7 @@ Windows:
|
||||||
|
|
||||||
访问:`\\<你的ip>\<你的共享路径>` :
|
访问:`\\<你的ip>\<你的共享路径>` :
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180928161334.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920180928161334.png"/></div><br>
|
||||||
|
|
||||||
Mac:
|
Mac:
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ Beats 是安装在服务器上的数据中转代理。
|
||||||
|
|
||||||
Beats 可以将数据直接传输到 Elasticsearch 或传输到 Logstash 。
|
Beats 可以将数据直接传输到 Elasticsearch 或传输到 Logstash 。
|
||||||
|
|
||||||
![Beats Platform](https://www.elastic.co/guide/en/beats/libbeat/current/images/beats-platform.png)
|
<br><div align="center"><img src="https://www.elastic.co/guide/en/beats/libbeat/current/images/beats-platform.png"/></div><br>
|
||||||
|
|
||||||
Beats 有多种类型,可以根据实际应用需要选择合适的类型。
|
Beats 有多种类型,可以根据实际应用需要选择合适的类型。
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ Filebeat带有内部模块(auditd,Apache,Nginx,System和MySQL),可
|
||||||
|
|
||||||
FileBeat 不会让你的管道超负荷。FileBeat 如果是向 Logstash 传输数据,当 Logstash 忙于处理数据,会通知 FileBeat 放慢读取速度。一旦拥塞得到解决,FileBeat 将恢复到原来的速度并继续传播。
|
FileBeat 不会让你的管道超负荷。FileBeat 如果是向 Logstash 传输数据,当 Logstash 忙于处理数据,会通知 FileBeat 放慢读取速度。一旦拥塞得到解决,FileBeat 将恢复到原来的速度并继续传播。
|
||||||
|
|
||||||
![Beats design](https://www.elastic.co/guide/en/beats/filebeat/current/images/filebeat.png)
|
<br><div align="center"><img src="https://www.elastic.co/guide/en/beats/filebeat/current/images/filebeat.png"/></div><br>
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
单击侧面导航栏中的 `Discover` ,可以显示 `Kibana` 的数据查询功能功能。
|
单击侧面导航栏中的 `Discover` ,可以显示 `Kibana` 的数据查询功能功能。
|
||||||
|
|
||||||
![https://www.elastic.co/guide/en/kibana/current/images/tutorial-discover.png](https://www.elastic.co/guide/en/kibana/current/images/tutorial-discover.png)
|
<br><div align="center"><img src="https://www.elastic.co/guide/en/kibana/current/images/tutorial-discover.png"/></div><br>
|
||||||
|
|
||||||
在搜索栏中,您可以输入Elasticsearch查询条件来搜索您的数据。您可以在 `Discover` 页面中浏览结果并在 `Visualize` 页面中创建已保存搜索条件的可视化。
|
在搜索栏中,您可以输入Elasticsearch查询条件来搜索您的数据。您可以在 `Discover` 页面中浏览结果并在 `Visualize` 页面中创建已保存搜索条件的可视化。
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
默认情况下,每个匹配文档都显示所有字段。要选择要显示的文档字段,请将鼠标悬停在“可用字段”列表上,然后单击要包含的每个字段旁边的添加按钮。例如,如果只添加account_number,则显示将更改为包含五个帐号的简单列表:
|
默认情况下,每个匹配文档都显示所有字段。要选择要显示的文档字段,请将鼠标悬停在“可用字段”列表上,然后单击要包含的每个字段旁边的添加按钮。例如,如果只添加account_number,则显示将更改为包含五个帐号的简单列表:
|
||||||
|
|
||||||
![https://www.elastic.co/guide/en/kibana/6.1/images/tutorial-discover-3.png](https://www.elastic.co/guide/en/kibana/6.1/images/tutorial-discover-3.png)
|
<br><div align="center"><img src="https://www.elastic.co/guide/en/kibana/6.1/images/tutorial-discover-3.png"/></div><br>
|
||||||
|
|
||||||
### 查询语义
|
### 查询语义
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ quick brown forks
|
||||||
但是,由于拼写错误,我们的查询关键字变成如下情况,依然可以查到想要的结果。
|
但是,由于拼写错误,我们的查询关键字变成如下情况,依然可以查到想要的结果。
|
||||||
|
|
||||||
```
|
```
|
||||||
quikc~ brwn~ foks~
|
quikc\~ brwn\~ foks\~
|
||||||
```
|
```
|
||||||
|
|
||||||
这种模糊查询使用 Damerau-Levenshtein 距离来查找所有匹配最多两个更改的项。所谓的更改是指单个字符的插入,删除或替换,或者两个相邻字符的换位。
|
这种模糊查询使用 Damerau-Levenshtein 距离来查找所有匹配最多两个更改的项。所谓的更改是指单个字符的插入,删除或替换,或者两个相邻字符的换位。
|
||||||
|
@ -113,7 +113,7 @@ quikc~ brwn~ foks~
|
||||||
默认编辑距离为 `2`,但编辑距离为 `1` 应足以捕捉所有人类拼写错误的80%。它可以被指定为:
|
默认编辑距离为 `2`,但编辑距离为 `1` 应足以捕捉所有人类拼写错误的80%。它可以被指定为:
|
||||||
|
|
||||||
```
|
```
|
||||||
quikc~1
|
quikc\~1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 近似检索
|
#### 近似检索
|
||||||
|
@ -123,7 +123,7 @@ quikc~1
|
||||||
例
|
例
|
||||||
|
|
||||||
```
|
```
|
||||||
"fox quick"~5
|
"fox quick"\~5
|
||||||
```
|
```
|
||||||
|
|
||||||
字段中的文本越接近查询字符串中指定的原始顺序,该文档就越被认为是相关的。当与上面的示例查询相比时,短语 `"quick fox"` 将被认为比 `"quick brown fox"` 更近似查询条件。
|
字段中的文本越接近查询字符串中指定的原始顺序,该文档就越被认为是相关的。当与上面的示例查询相比时,短语 `"quick fox"` 将被认为比 `"quick brown fox"` 更近似查询条件。
|
||||||
|
|
|
@ -32,7 +32,7 @@ Logstash 有两个必要元素:`input` 和 `output` ,一个可选元素:`f
|
||||||
|
|
||||||
这三个元素,分别代表 Logstash 事件处理的三个阶段:输入 > 过滤器 > 输出。
|
这三个元素,分别代表 Logstash 事件处理的三个阶段:输入 > 过滤器 > 输出。
|
||||||
|
|
||||||
![logstash 工作原理.png](https://www.elastic.co/guide/en/logstash/current/static/images/basic_logstash_pipeline.png)
|
<br><div align="center"><img src="https://www.elastic.co/guide/en/logstash/current/static/images/basic_logstash_pipeline.png"/></div><br>
|
||||||
|
|
||||||
- input 负责从数据源采集数据。
|
- input 负责从数据源采集数据。
|
||||||
- filter 将数据修改为你指定的格式或内容。
|
- filter 将数据修改为你指定的格式或内容。
|
||||||
|
|
|
@ -32,7 +32,7 @@ ELK 是 elastic 公司旗下三款产品 [ElasticSearch](https://www.elastic.co/
|
||||||
|
|
||||||
### Elastic 架构
|
### Elastic 架构
|
||||||
|
|
||||||
![static/images/deploy3.png](https://www.elastic.co/guide/en/logstash/current/static/images/deploy3.png)
|
<br><div align="center"><img src="https://www.elastic.co/guide/en/logstash/current/static/images/deploy3.png"/></div><br>
|
||||||
|
|
||||||
> **说明**
|
> **说明**
|
||||||
>
|
>
|
||||||
|
@ -274,7 +274,7 @@ output {
|
||||||
|
|
||||||
大功告成,此后,`io.github.dunwu.spring` 包中的 TRACE 及以上级别的日志信息都会被定向输出到 logstash 服务。
|
大功告成,此后,`io.github.dunwu.spring` 包中的 TRACE 及以上级别的日志信息都会被定向输出到 logstash 服务。
|
||||||
|
|
||||||
![image.png](http://upload-images.jianshu.io/upload_images/3101171-cd876d79a14955b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-cd876d79a14955b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/></div><br>
|
||||||
|
|
||||||
## 资料
|
## 资料
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# Gitlab
|
# Gitlab
|
||||||
|
|
||||||
![](https://docs.gitlab.com/ce/ci/img/cicd_pipeline_infograph.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/ci/img/cicd_pipeline_infograph.png"/></div><br>
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
进入官方下载地址:https://about.gitlab.com/install/ ,如下图,选择合适的版本。
|
进入官方下载地址:https://about.gitlab.com/install/ ,如下图,选择合适的版本。
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/snap/20190129155838.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/snap/20190129155838.png"/></div><br>
|
||||||
|
|
||||||
以 CentOS7 为例:
|
以 CentOS7 为例:
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ docker run -d \
|
||||||
gitlab/gitlab-ce
|
gitlab/gitlab-ce
|
||||||
```
|
```
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/snap/20190131150515.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/snap/20190131150515.png"/></div><br>
|
||||||
|
|
||||||
## 安装 gitlab-ci-multi-runner
|
## 安装 gitlab-ci-multi-runner
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ sudo gitlab-runner register
|
||||||
|
|
||||||
URL 和令牌信息在 Gitlab 的 Runner 管理页面获取:
|
URL 和令牌信息在 Gitlab 的 Runner 管理页面获取:
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/snap/20190129163100.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/snap/20190129163100.png"/></div><br>
|
||||||
|
|
||||||
```
|
```
|
||||||
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
|
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
|
||||||
|
|
|
@ -12,31 +12,31 @@
|
||||||
|
|
||||||
3. 打开 **Profile settings**.
|
3. 打开 **Profile settings**.
|
||||||
|
|
||||||
![Profile settings dropdown](https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings.png"/></div><br>
|
||||||
|
|
||||||
4. 跳转到 **SSH keys** tab 页
|
4. 跳转到 **SSH keys** tab 页
|
||||||
|
|
||||||
![SSH Keys](https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys.png"/></div><br>
|
||||||
|
|
||||||
5. 黏贴你的 SSH 公钥内容到 Key 文本框
|
5. 黏贴你的 SSH 公钥内容到 Key 文本框
|
||||||
|
|
||||||
![Paste SSH public key](https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys_paste_pub.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys_paste_pub.png"/></div><br>
|
||||||
|
|
||||||
6. 为了便于识别,你可以为其命名
|
6. 为了便于识别,你可以为其命名
|
||||||
|
|
||||||
![SSH key title](https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys_title.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys_title.png"/></div><br>
|
||||||
|
|
||||||
7. 点击 **Add key** 将 SSH 公钥添加到 GitLab
|
7. 点击 **Add key** 将 SSH 公钥添加到 GitLab
|
||||||
|
|
||||||
![SSH key single page](https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys_single_key.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/gitlab-basics/img/profile_settings_ssh_keys_single_key.png"/></div><br>
|
||||||
|
|
||||||
## 创建项目
|
## 创建项目
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/snap/20190131150658.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/snap/20190131150658.png"/></div><br>
|
||||||
|
|
||||||
输入项目信息,点击 Create project 按钮,在 Gitlab 创建项目。
|
输入项目信息,点击 Create project 按钮,在 Gitlab 创建项目。
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/snap/20190131150759.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/snap/20190131150759.png"/></div><br>
|
||||||
|
|
||||||
## 克隆项目到本地
|
## 克隆项目到本地
|
||||||
|
|
||||||
|
@ -44,29 +44,29 @@
|
||||||
|
|
||||||
拷贝项目地址,然后在本地执行 `git clone <url>`
|
拷贝项目地址,然后在本地执行 `git clone <url>`
|
||||||
|
|
||||||
![1548919326929](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1548919326929.png)
|
<br><div align="center"><img src="C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1548919326929.png"/></div><br>
|
||||||
|
|
||||||
## 创建 Issue
|
## 创建 Issue
|
||||||
|
|
||||||
依次点击 **Project’s Dashboard** > **Issues** > **New Issue** 可以新建 Issue
|
依次点击 **Project’s Dashboard** > **Issues** > **New Issue** 可以新建 Issue
|
||||||
|
|
||||||
![New issue from the issue list view](https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_tracker_list.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_tracker_list.png"/></div><br>
|
||||||
|
|
||||||
在项目中直接添加 issue
|
在项目中直接添加 issue
|
||||||
|
|
||||||
![New issue from the issues list](https://docs.gitlab.com/ce/user/project/issues/img/new_issue.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/user/project/issues/img/new_issue.png"/></div><br>
|
||||||
|
|
||||||
在未关闭 issue 中,点击 **New Issue** 添加 issue
|
在未关闭 issue 中,点击 **New Issue** 添加 issue
|
||||||
|
|
||||||
![New issue from an open issue](https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_open_issue.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_open_issue.png"/></div><br>
|
||||||
|
|
||||||
通过项目面板添加 issue
|
通过项目面板添加 issue
|
||||||
|
|
||||||
![New issue from a project's dashboard](https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_projects_dashboard.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_projects_dashboard.png"/></div><br>
|
||||||
|
|
||||||
通过 issue 面板添加 issue
|
通过 issue 面板添加 issue
|
||||||
|
|
||||||
![From the issue board](https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_issue_board.png)
|
<br><div align="center"><img src="https://docs.gitlab.com/ce/user/project/issues/img/new_issue_from_issue_board.png"/></div><br>
|
||||||
|
|
||||||
## 引申和引用
|
## 引申和引用
|
||||||
|
|
||||||
|
|
|
@ -22,13 +22,13 @@ a. 进入 [Java 官网下载页面](https://www.oracle.com/technetwork/java/java
|
||||||
|
|
||||||
b. 选择需要的版本:
|
b. 选择需要的版本:
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920181010164121.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920181010164121.png"/></div><br>
|
||||||
|
|
||||||
c. 选择对应操作系统的安装包:
|
c. 选择对应操作系统的安装包:
|
||||||
|
|
||||||
Windows 系统选择 exe 安装包;Mac 系统选择 dmp 安装包;Linux 系统选择 tar.gz 压缩包(RedHat 发行版可以安装 rpm 包)。
|
Windows 系统选择 exe 安装包;Mac 系统选择 dmp 安装包;Linux 系统选择 tar.gz 压缩包(RedHat 发行版可以安装 rpm 包)。
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920181010164308.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920181010164308.png"/></div><br>
|
||||||
|
|
||||||
(2)运行安装包,按提示逐步安装
|
(2)运行安装包,按提示逐步安装
|
||||||
|
|
||||||
|
@ -51,11 +51,11 @@ Windows 系统选择 exe 安装包;Mac 系统选择 dmp 安装包;Linux 系
|
||||||
|
|
||||||
a. 安装完成后,右击"我的电脑",点击"属性",选择"高级系统设置";
|
a. 安装完成后,右击"我的电脑",点击"属性",选择"高级系统设置";
|
||||||
|
|
||||||
![img](https://www.runoob.com/wp-content/uploads/2013/12/win-java1.png)
|
<br><div align="center"><img src="https://www.runoob.com/wp-content/uploads/2013/12/win-java1.png"/></div><br>
|
||||||
|
|
||||||
b. 选择"高级"选项卡,点击"环境变量";
|
b. 选择"高级"选项卡,点击"环境变量";
|
||||||
|
|
||||||
![img](https://www.runoob.com/wp-content/uploads/2013/12/java-win2.png)
|
<br><div align="center"><img src="https://www.runoob.com/wp-content/uploads/2013/12/java-win2.png"/></div><br>
|
||||||
|
|
||||||
然后就会出现如下图所示的画面:
|
然后就会出现如下图所示的画面:
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ a. "开始"->"运行",键入"cmd";
|
||||||
|
|
||||||
b. 键入命令: **java -version**、**java**、**javac** 几个命令,出现以下信息,说明环境变量配置成功;
|
b. 键入命令: **java -version**、**java**、**javac** 几个命令,出现以下信息,说明环境变量配置成功;
|
||||||
|
|
||||||
![img](https://www.runoob.com/wp-content/uploads/2013/12/java-win9.png)
|
<br><div align="center"><img src="https://www.runoob.com/wp-content/uploads/2013/12/java-win9.png"/></div><br>
|
||||||
|
|
||||||
## Linux 系统安装方法
|
## Linux 系统安装方法
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ nohup java -jar jenkins.war --httpPort=8080 >> nohup.out 2>&1 &
|
||||||
|
|
||||||
**现象**:输入密码后,卡在 check 页面
|
**现象**:输入密码后,卡在 check 页面
|
||||||
|
|
||||||
![jenkins-checking.png](images/jenkins-checking.png)
|
<br><div align="center"><img src="images/jenkins-checking.png"/></div><br>
|
||||||
|
|
||||||
**原因**:jenkins 在安装插件前总是尝试连接 www.google.com,来判断网络是否连通。谷歌的网站在大陆是连不上的,所以会出现这个问题。
|
**原因**:jenkins 在安装插件前总是尝试连接 www.google.com,来判断网络是否连通。谷歌的网站在大陆是连不上的,所以会出现这个问题。
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
进入[官方下载地址](https://www.sonatype.com/download-oss-sonatype),选择合适版本下载。
|
进入[官方下载地址](https://www.sonatype.com/download-oss-sonatype),选择合适版本下载。
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180929160614.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920180929160614.png"/></div><br>
|
||||||
|
|
||||||
本人希望将 Nexus 部署在 Linux 机器,所以选用的是 Unix 版本。
|
本人希望将 Nexus 部署在 Linux 机器,所以选用的是 Unix 版本。
|
||||||
|
|
||||||
|
@ -56,13 +56,13 @@ Usage: ./nexus {start|stop|run|run-redirect|status|restart|force-reload}
|
||||||
|
|
||||||
启动成功后,在浏览器中访问 `http://<ip>:8081`,欢迎页面如下图所示:
|
启动成功后,在浏览器中访问 `http://<ip>:8081`,欢迎页面如下图所示:
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180929164140.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920180929164140.png"/></div><br>
|
||||||
|
|
||||||
点击右上角 Sign in 登录,默认用户名/密码为:admin/admin123。
|
点击右上角 Sign in 登录,默认用户名/密码为:admin/admin123。
|
||||||
|
|
||||||
有必要提一下的是,在 Nexus 的 Repositories 管理页面,展示了可用的 maven 仓库,如下图所示:
|
有必要提一下的是,在 Nexus 的 Repositories 管理页面,展示了可用的 maven 仓库,如下图所示:
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180929170924.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920180929170924.png"/></div><br>
|
||||||
|
|
||||||
> 说明:
|
> 说明:
|
||||||
>
|
>
|
||||||
|
|
|
@ -143,7 +143,7 @@ $ vi /etc/sysconfig/svnserve
|
||||||
|
|
||||||
在新的窗口,输入地址 `svn://<你的 IP>` 即可,不出意外输入用户名和密码就能连接成功了(这里的用户、密码必须在 passwd 配置文件的清单中)。默认端口 3690,如果你修改了端口,那么要记得加上端口号。如下图所示:
|
在新的窗口,输入地址 `svn://<你的 IP>` 即可,不出意外输入用户名和密码就能连接成功了(这里的用户、密码必须在 passwd 配置文件的清单中)。默认端口 3690,如果你修改了端口,那么要记得加上端口号。如下图所示:
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/snap/20190129175443.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/snap/20190129175443.png"/></div><br>
|
||||||
|
|
||||||
## 2. 引申和引用
|
## 2. 引申和引用
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,7 @@ Python 语言支持以下类型的运算符:
|
||||||
| & | 按位与运算符:参与运算的两个值,如果两个相应位都为 1,则该位的结果为 1,否则为 0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
|
| & | 按位与运算符:参与运算的两个值,如果两个相应位都为 1,则该位的结果为 1,否则为 0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
|
||||||
| \| | 按位或运算符:只要对应的二个二进位有一个为 1 时,结果位就为 1。 | (a \| b) 输出结果 61 ,二进制解释: 0011 1101 |
|
| \| | 按位或运算符:只要对应的二个二进位有一个为 1 时,结果位就为 1。 | (a \| b) 输出结果 61 ,二进制解释: 0011 1101 |
|
||||||
| ^ | 按位异或运算符:当两对应的二进位相异时,结果为 1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
|
| ^ | 按位异或运算符:当两对应的二进位相异时,结果为 1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
|
||||||
| ~ | 按位取反运算符:对数据的每个二进制位取反,即把 1 变为 0,把 0 变为 1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。 |
|
| \~ | 按位取反运算符:对数据的每个二进制位取反,即把 1 变为 0,把 0 变为 1 | (\~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。 |
|
||||||
| << | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补 0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
|
| << | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补 0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
|
||||||
| >> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
|
| >> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ Python 语言支持以下类型的运算符:
|
||||||
| 运算符 | 描述 |
|
| 运算符 | 描述 |
|
||||||
| --------------------------- | ------------------------------------------------------ |
|
| --------------------------- | ------------------------------------------------------ |
|
||||||
| \*\* | 指数 (最高优先级) |
|
| \*\* | 指数 (最高优先级) |
|
||||||
| ~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
|
| \~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
|
||||||
| \* / % // | 乘,除,取模和取整除 |
|
| \* / % // | 乘,除,取模和取整除 |
|
||||||
| + - | 加法减法 |
|
| + - | 加法减法 |
|
||||||
| >> << | 右移,左移运算符 |
|
| >> << | 右移,左移运算符 |
|
||||||
|
|
|
@ -61,7 +61,7 @@ Git 是一个非常优秀的版本控制工具,但是在实际版本管理中
|
||||||
|
|
||||||
下面,来介绍一下 git-flow 模型。
|
下面,来介绍一下 git-flow 模型。
|
||||||
|
|
||||||
![git-flow.png](http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-flow.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-flow.png"/></div><br>
|
||||||
|
|
||||||
`Gitflow`工作流仍然用中央仓库作为所有开发者的交互中心。和其它的工作流一样,开发者在本地工作并`push`分支到要中央仓库中。
|
`Gitflow`工作流仍然用中央仓库作为所有开发者的交互中心。和其它的工作流一样,开发者在本地工作并`push`分支到要中央仓库中。
|
||||||
|
|
||||||
|
@ -73,19 +73,19 @@ Git 是一个非常优秀的版本控制工具,但是在实际版本管理中
|
||||||
|
|
||||||
`develop` 分支作为功能的集成分支。
|
`develop` 分支作为功能的集成分支。
|
||||||
|
|
||||||
![img](https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-1historical.png)
|
<br><div align="center"><img src="https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-1historical.png"/></div><br>
|
||||||
|
|
||||||
### 功能分支
|
### 功能分支
|
||||||
|
|
||||||
每个新功能位于一个自己的分支,这样可以[`push`到中央仓库以备份和协作](https://www.atlassian.com/git/tutorial/remote-repositories#!push)。但功能分支不是从`master`分支上拉出新分支,而是使用`develop`分支作为父分支。当新功能完成时,[合并回`develop`分支](https://www.atlassian.com/git/tutorial/git-branches#!merge)。新功能提交应该从不直接与`master`分支交互。
|
每个新功能位于一个自己的分支,这样可以[`push`到中央仓库以备份和协作](https://www.atlassian.com/git/tutorial/remote-repositories#!push)。但功能分支不是从`master`分支上拉出新分支,而是使用`develop`分支作为父分支。当新功能完成时,[合并回`develop`分支](https://www.atlassian.com/git/tutorial/git-branches#!merge)。新功能提交应该从不直接与`master`分支交互。
|
||||||
|
|
||||||
![img](https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-2feature.png)
|
<br><div align="center"><img src="https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-2feature.png"/></div><br>
|
||||||
|
|
||||||
注意,从各种含义和目的上来看,功能分支加上`develop`分支就是功能分支工作流的用法。但`Gitflow`工作流没有在这里止步。
|
注意,从各种含义和目的上来看,功能分支加上`develop`分支就是功能分支工作流的用法。但`Gitflow`工作流没有在这里止步。
|
||||||
|
|
||||||
### 发布分支
|
### 发布分支
|
||||||
|
|
||||||
![img](https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-3release.png)
|
<br><div align="center"><img src="https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-3release.png"/></div><br>
|
||||||
|
|
||||||
一旦`develop`分支上有了做一次发布(或者说快到了既定的发布日)的足够功能,就从`develop`分支上`fork`一个发布分支。新建的分支用于开始发布循环,所以从这个时间点开始之后新的功能不能再加到这个分支上 —— 这个分支只应该做`Bug`修复、文档生成和其它面向发布任务。一旦对外发布的工作都完成了,发布分支合并到`master`分支并分配一个版本号打好`Tag`。另外,这些从新建发布分支以来的做的修改要合并回`develop`分支。
|
一旦`develop`分支上有了做一次发布(或者说快到了既定的发布日)的足够功能,就从`develop`分支上`fork`一个发布分支。新建的分支用于开始发布循环,所以从这个时间点开始之后新的功能不能再加到这个分支上 —— 这个分支只应该做`Bug`修复、文档生成和其它面向发布任务。一旦对外发布的工作都完成了,发布分支合并到`master`分支并分配一个版本号打好`Tag`。另外,这些从新建发布分支以来的做的修改要合并回`develop`分支。
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ Git 是一个非常优秀的版本控制工具,但是在实际版本管理中
|
||||||
|
|
||||||
### 维护分支
|
### 维护分支
|
||||||
|
|
||||||
![img](https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-4maintenance.png)
|
<br><div align="center"><img src="https://raw.githubusercontent.com/quickhack/translations/master/git-workflows-and-tutorials/images/git-workflow-release-cycle-4maintenance.png"/></div><br>
|
||||||
|
|
||||||
维护分支或说是热修复(`hotfix`)分支用于生成快速给产品发布版本(`production releases`)打补丁,这是唯一可以直接从`master`分支`fork`出来的分支。修复完成,修改应该马上合并回`master`分支和`develop`分支(当前的发布分支),`master`分支应该用新的版本号打好`Tag`。
|
维护分支或说是热修复(`hotfix`)分支用于生成快速给产品发布版本(`production releases`)打补丁,这是唯一可以直接从`master`分支`fork`出来的分支。修复完成,修改应该马上合并回`master`分支和`develop`分支(当前的发布分支),`master`分支应该用新的版本号打好`Tag`。
|
||||||
|
|
||||||
|
@ -236,19 +236,19 @@ $ wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develo
|
||||||
|
|
||||||
#### 使用
|
#### 使用
|
||||||
|
|
||||||
- **初始化:** git flow init
|
- **初始化:** git flow init
|
||||||
- **开始新Feature:** git flow feature start MYFEATURE
|
- **开始新Feature:** git flow feature start MYFEATURE
|
||||||
- **Publish一个Feature(也就是push到远程):** git flow feature publish MYFEATURE
|
- **Publish一个Feature(也就是push到远程):** git flow feature publish MYFEATURE
|
||||||
- **获取Publish的Feature:** git flow feature pull origin MYFEATURE
|
- **获取Publish的Feature:** git flow feature pull origin MYFEATURE
|
||||||
- **完成一个Feature:** git flow feature finish MYFEATURE
|
- **完成一个Feature:** git flow feature finish MYFEATURE
|
||||||
- **开始一个Release:** git flow release start RELEASE [BASE]
|
- **开始一个Release:** git flow release start RELEASE [BASE]
|
||||||
- **Publish一个Release:** git flow release publish RELEASE
|
- **Publish一个Release:** git flow release publish RELEASE
|
||||||
- **发布Release:** git flow release finish RELEASE
|
- **发布Release:** git flow release finish RELEASE
|
||||||
别忘了git push --tags
|
别忘了git push --tags
|
||||||
- **开始一个Hotfix:** git flow hotfix start VERSION [BASENAME]
|
- **开始一个Hotfix:** git flow hotfix start VERSION [BASENAME]
|
||||||
- **发布一个Hotfix:** git flow hotfix finish VERSION
|
- **发布一个Hotfix:** git flow hotfix finish VERSION
|
||||||
|
|
||||||
![git-flow-commands.png](http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-flow-commands.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-flow-commands.png"/></div><br>
|
||||||
|
|
||||||
### Source Tree
|
### Source Tree
|
||||||
|
|
||||||
|
|
|
@ -388,7 +388,7 @@ HEAD is now at a13b85e
|
||||||
|
|
||||||
然后, 正常提交。
|
然后, 正常提交。
|
||||||
|
|
||||||
Note: Spike solutions are made to analyze or solve the problem. These solutions are used for estimation and discarded once everyone gets clear visualization of the problem. ~ [Wikipedia](https://en.wikipedia.org/wiki/Extreme_programming_practices).
|
Note: Spike solutions are made to analyze or solve the problem. These solutions are used for estimation and discarded once everyone gets clear visualization of the problem. \~ [Wikipedia](https://en.wikipedia.org/wiki/Extreme_programming_practices).
|
||||||
|
|
||||||
### 我把几个提交(commit)提交到了同一个分支,而这些提交应该分布在不同的分支里
|
### 我把几个提交(commit)提交到了同一个分支,而这些提交应该分布在不同的分支里
|
||||||
|
|
||||||
|
@ -608,7 +608,7 @@ Switched to a new branch 'daves'
|
||||||
(my-branch)$ git rebase -i master
|
(my-branch)$ git rebase -i master
|
||||||
```
|
```
|
||||||
|
|
||||||
如果没有相对的其它分支, 你将不得不相对自己的`HEAD` 进行 rebase。 例如:你想组合最近的两次提交(commit), 你将相对于`HEAD~2` 进行rebase, 组合最近3次提交(commit), 相对于`HEAD~3`, 等等。
|
如果没有相对的其它分支, 你将不得不相对自己的`HEAD` 进行 rebase。 例如:你想组合最近的两次提交(commit), 你将相对于`HEAD\~2` 进行rebase, 组合最近3次提交(commit), 相对于`HEAD\~3`, 等等。
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
(master)$ git rebase -i HEAD~2
|
(master)$ git rebase -i HEAD~2
|
||||||
|
@ -734,7 +734,7 @@ noop
|
||||||
这意味着你rebase的分支和当前分支在同一个提交(commit)上, 或者 *领先(ahead)* 当前分支。 你可以尝试:
|
这意味着你rebase的分支和当前分支在同一个提交(commit)上, 或者 *领先(ahead)* 当前分支。 你可以尝试:
|
||||||
|
|
||||||
* 检查确保主(master)分支没有问题
|
* 检查确保主(master)分支没有问题
|
||||||
* rebase `HEAD~2` 或者更早
|
* rebase `HEAD\~2` 或者更早
|
||||||
|
|
||||||
#### 有冲突的情况
|
#### 有冲突的情况
|
||||||
|
|
||||||
|
@ -846,7 +846,7 @@ $ git update-ref refs/tags/<tag_name> <hash>
|
||||||
|
|
||||||
### 我想给一些Git命令添加别名(alias)
|
### 我想给一些Git命令添加别名(alias)
|
||||||
|
|
||||||
在 OS X 和 Linux 下, 你的 Git的配置文件储存在 ```~/.gitconfig```。我在```[alias]``` 部分添加了一些快捷别名(和一些我容易拼写错误的),如下:
|
在 OS X 和 Linux 下, 你的 Git的配置文件储存在 ```\~/.gitconfig```。我在```[alias]``` 部分添加了一些快捷别名(和一些我容易拼写错误的),如下:
|
||||||
|
|
||||||
```vim
|
```vim
|
||||||
[alias]
|
[alias]
|
||||||
|
@ -893,7 +893,7 @@ $ git config --global credential.helper 'cache --timeout=3600'
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
(master)$ git reflog
|
(master)$ git reflog
|
||||||
0a2e358 HEAD@{0}: reset: moving to HEAD~2
|
0a2e358 HEAD@{0}: reset: moving to HEAD\~2
|
||||||
0254ea7 HEAD@{1}: checkout: moving from 2.2 to master
|
0254ea7 HEAD@{1}: checkout: moving from 2.2 to master
|
||||||
c10f740 HEAD@{2}: checkout: moving from master to 2.2
|
c10f740 HEAD@{2}: checkout: moving from master to 2.2
|
||||||
```
|
```
|
||||||
|
@ -911,4 +911,4 @@ $ git reset --hard 0254ea7
|
||||||
## 资源
|
## 资源
|
||||||
|
|
||||||
* https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md
|
* https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md
|
||||||
* https://github.com/521xueweihan/git-tips
|
* https://github.com/521xueweihan/git-tips
|
||||||
|
|
|
@ -2,19 +2,19 @@
|
||||||
|
|
||||||
## 配置 Git
|
## 配置 Git
|
||||||
|
|
||||||
Git 使用一系列配置文件来保存你自定义的行为。 它首先会查找 `/etc/gitconfig` 文件,该文件含有系统里每位用户及他们所拥有的仓库的配置值。 如果你传递 `--system` 选项给 `git config`,它就会读写该文件。
|
Git 使用一系列配置文件来保存你自定义的行为。 它首先会查找 `/etc/gitconfig` 文件,该文件含有系统里每位用户及他们所拥有的仓库的配置值。 如果你传递 `--system` 选项给 `git config`,它就会读写该文件。
|
||||||
|
|
||||||
接下来 Git 会查找每个用户的 `~/.gitconfig` 文件(或者 `~/.config/git/config` 文件)。 你可以传递 `--global` 选项让 Git 读写该文件。
|
接下来 Git 会查找每个用户的 `\~/.gitconfig` 文件(或者 `\~/.config/git/config` 文件)。 你可以传递 `--global` 选项让 Git 读写该文件。
|
||||||
|
|
||||||
最后 Git 会查找你正在操作的版本库所对应的 Git 目录下的配置文件(`.git/config`)。 这个文件中的值只对该版本库有效。
|
最后 Git 会查找你正在操作的版本库所对应的 Git 目录下的配置文件(`.git/config`)。 这个文件中的值只对该版本库有效。
|
||||||
|
|
||||||
以上三个层次中每层的配置(系统、全局、本地)都会覆盖掉上一层次的配置,所以 `.git/config` 中的值会覆盖掉 `/etc/gitconfig` 中所对应的值。
|
以上三个层次中每层的配置(系统、全局、本地)都会覆盖掉上一层次的配置,所以 `.git/config` 中的值会覆盖掉 `/etc/gitconfig` 中所对应的值。
|
||||||
|
|
||||||
## 客户端基本配置
|
## 客户端基本配置
|
||||||
|
|
||||||
### `core.editor`
|
### `core.editor`
|
||||||
|
|
||||||
默认情况下,Git 会调用环境变量(`$VISUAL` 或 `$EDITOR`)设置的任意文本编辑器,如果没有设置,会调用 `vi` 来创建和编辑你的提交以及标签信息。 你可以使用 `core.editor` 选项来修改默认的编辑器:
|
默认情况下,Git 会调用环境变量(`$VISUAL` 或 `$EDITOR`)设置的任意文本编辑器,如果没有设置,会调用 `vi` 来创建和编辑你的提交以及标签信息。 你可以使用 `core.editor` 选项来修改默认的编辑器:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global core.editor emacs
|
$ git config --global core.editor emacs
|
||||||
|
@ -24,7 +24,7 @@ $ git config --global core.editor emacs
|
||||||
|
|
||||||
### `commit.template`
|
### `commit.template`
|
||||||
|
|
||||||
如果把此项指定为你的系统上某个文件的路径,当你提交的时候, Git 会使用该文件的内容作为提交的默认信息。 例如:假设你创建了一个叫 `~/.gitmessage.txt` 的模板文件,类似这样:
|
如果把此项指定为你的系统上某个文件的路径,当你提交的时候, Git 会使用该文件的内容作为提交的默认信息。 例如:假设你创建了一个叫 `\~/.gitmessage.txt` 的模板文件,类似这样:
|
||||||
|
|
||||||
```
|
```
|
||||||
subject line
|
subject line
|
||||||
|
@ -34,7 +34,7 @@ what happened
|
||||||
[ticket: X]
|
[ticket: X]
|
||||||
```
|
```
|
||||||
|
|
||||||
要想让 Git 把它作为运行 `git commit` 时显示在你的编辑器中的默认信息, 如下设置 `commit.template`:
|
要想让 Git 把它作为运行 `git commit` 时显示在你的编辑器中的默认信息, 如下设置 `commit.template`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global commit.template ~/.gitmessage.txt
|
$ git config --global commit.template ~/.gitmessage.txt
|
||||||
|
@ -66,7 +66,7 @@ what happened
|
||||||
|
|
||||||
### `core.pager`
|
### `core.pager`
|
||||||
|
|
||||||
该配置项指定 Git 运行诸如 `log` 和 `diff` 等命令所使用的分页器。 你可以把它设置成用 `more` 或者任何你喜欢的分页器(默认用的是 `less`),当然也可以设置成空字符串,关闭该选项:
|
该配置项指定 Git 运行诸如 `log` 和 `diff` 等命令所使用的分页器。 你可以把它设置成用 `more` 或者任何你喜欢的分页器(默认用的是 `less`),当然也可以设置成空字符串,关闭该选项:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global core.pager ''
|
$ git config --global core.pager ''
|
||||||
|
@ -76,13 +76,13 @@ $ git config --global core.pager ''
|
||||||
|
|
||||||
### `user.signingkey`
|
### `user.signingkey`
|
||||||
|
|
||||||
如果你要创建经签署的含附注的标签(正如 [签署工作](https://git-scm.com/book/zh/v2/ch00/r_signing) 所述),那么把你的 GPG 签署密钥设置为配置项会更好。 如下设置你的密钥 ID:
|
如果你要创建经签署的含附注的标签(正如 [签署工作](https://git-scm.com/book/zh/v2/ch00/r_signing) 所述),那么把你的 GPG 签署密钥设置为配置项会更好。 如下设置你的密钥 ID:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global user.signingkey <gpg-key-id>
|
$ git config --global user.signingkey <gpg-key-id>
|
||||||
```
|
```
|
||||||
|
|
||||||
现在,你每次运行 `git tag` 命令时,即可直接签署标签,而无需定义密钥:
|
现在,你每次运行 `git tag` 命令时,即可直接签署标签,而无需定义密钥:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git tag -s <tag-name>
|
$ git tag -s <tag-name>
|
||||||
|
@ -90,18 +90,18 @@ $ git tag -s <tag-name>
|
||||||
|
|
||||||
### `core.excludesfile`
|
### `core.excludesfile`
|
||||||
|
|
||||||
正如 [忽略文件](https://git-scm.com/book/zh/v2/ch00/r_ignoring) 所述,你可以在你的项目的 `.gitignore` 文件里面规定无需纳入 Git 管理的文件的模板,这样它们既不会出现在未跟踪列表,也不会在你运行 `git add` 后被暂存。
|
正如 [忽略文件](https://git-scm.com/book/zh/v2/ch00/r_ignoring) 所述,你可以在你的项目的 `.gitignore` 文件里面规定无需纳入 Git 管理的文件的模板,这样它们既不会出现在未跟踪列表,也不会在你运行 `git add` 后被暂存。
|
||||||
|
|
||||||
不过有些时候,你想要在你所有的版本库中忽略掉某一类文件。 如果你的操作系统是 OS X,很可能就是指`.DS_Store`。 如果你把 Emacs 或 Vim 作为首选的编辑器,你肯定知道以 `~` 结尾的临时文件。
|
不过有些时候,你想要在你所有的版本库中忽略掉某一类文件。 如果你的操作系统是 OS X,很可能就是指`.DS_Store`。 如果你把 Emacs 或 Vim 作为首选的编辑器,你肯定知道以 `\~` 结尾的临时文件。
|
||||||
|
|
||||||
这个配置允许你设置类似于全局生效的 `.gitignore` 文件。 如果你按照下面的内容创建一个`~/.gitignore_global` 文件:
|
这个配置允许你设置类似于全局生效的 `.gitignore` 文件。 如果你按照下面的内容创建一个`\~/.gitignore_global` 文件:
|
||||||
|
|
||||||
```
|
```
|
||||||
*~
|
*~
|
||||||
.DS_Store
|
.DS_Store
|
||||||
```
|
```
|
||||||
|
|
||||||
……然后运行 `git config --global core.excludesfile ~/.gitignore_global`,Git 将把那些文件永远地拒之门外。
|
……然后运行 `git config --global core.excludesfile \~/.gitignore_global`,Git 将把那些文件永远地拒之门外。
|
||||||
|
|
||||||
### `help.autocorrect`
|
### `help.autocorrect`
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ git:'chekcout' 不是一个 git 命令。参见 'git --help'。
|
||||||
checkout
|
checkout
|
||||||
```
|
```
|
||||||
|
|
||||||
Git 会尝试猜测你的意图,但是它不会越俎代庖。 如果你把 `help.autocorrect` 设置成 1,那么只要有一个命令被模糊匹配到了,Git 会自动运行该命令。
|
Git 会尝试猜测你的意图,但是它不会越俎代庖。 如果你把 `help.autocorrect` 设置成 1,那么只要有一个命令被模糊匹配到了,Git 会自动运行该命令。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git chekcout master
|
$ git chekcout master
|
||||||
|
@ -124,7 +124,7 @@ $ git chekcout master
|
||||||
在 0.1 秒钟后自动运行...
|
在 0.1 秒钟后自动运行...
|
||||||
```
|
```
|
||||||
|
|
||||||
注意提示信息中的“0.1 秒”。`help.autocorrect` 接受一个代表十分之一秒的整数。 所以如果你把它设置为 50, Git 将在自动执行命令前给你 5 秒的时间改变主意。
|
注意提示信息中的“0.1 秒”。`help.autocorrect` 接受一个代表十分之一秒的整数。 所以如果你把它设置为 50, Git 将在自动执行命令前给你 5 秒的时间改变主意。
|
||||||
|
|
||||||
## 格式化与多余的空白字符
|
## 格式化与多余的空白字符
|
||||||
|
|
||||||
|
@ -134,13 +134,13 @@ $ git chekcout master
|
||||||
|
|
||||||
假如你正在 Windows 上写程序,而你的同伴用的是其他系统(或相反),你可能会遇到 CRLF 问题。 这是因为 Windows 使用回车(CR)和换行(LF)两个字符来结束一行,而 Mac 和 Linux 只使用换行(LF)一个字符。 虽然这是小问题,但它会极大地扰乱跨平台协作。许多 Windows 上的编辑器会悄悄把行尾的换行字符转换成回车和换行,或在用户按下 Enter 键时,插入回车和换行两个字符。
|
假如你正在 Windows 上写程序,而你的同伴用的是其他系统(或相反),你可能会遇到 CRLF 问题。 这是因为 Windows 使用回车(CR)和换行(LF)两个字符来结束一行,而 Mac 和 Linux 只使用换行(LF)一个字符。 虽然这是小问题,但它会极大地扰乱跨平台协作。许多 Windows 上的编辑器会悄悄把行尾的换行字符转换成回车和换行,或在用户按下 Enter 键时,插入回车和换行两个字符。
|
||||||
|
|
||||||
Git 可以在你提交时自动地把回车和换行转换成换行,而在检出代码时把换行转换成回车和换行。 你可以用 `core.autocrlf` 来打开此项功能。 如果是在 Windows 系统上,把它设置成 `true`,这样在检出代码时,换行会被转换成回车和换行:
|
Git 可以在你提交时自动地把回车和换行转换成换行,而在检出代码时把换行转换成回车和换行。 你可以用 `core.autocrlf` 来打开此项功能。 如果是在 Windows 系统上,把它设置成 `true`,这样在检出代码时,换行会被转换成回车和换行:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global core.autocrlf true
|
$ git config --global core.autocrlf true
|
||||||
```
|
```
|
||||||
|
|
||||||
如果使用以换行作为行结束符的 Linux 或 Mac,你不需要 Git 在检出文件时进行自动的转换;然而当一个以回车加换行作为行结束符的文件不小心被引入时,你肯定想让 Git 修正。 你可以把 `core.autocrlf` 设置成 input 来告诉 Git 在提交时把回车和换行转换成换行,检出时不转换:
|
如果使用以换行作为行结束符的 Linux 或 Mac,你不需要 Git 在检出文件时进行自动的转换;然而当一个以回车加换行作为行结束符的文件不小心被引入时,你肯定想让 Git 修正。 你可以把 `core.autocrlf` 设置成 input 来告诉 Git 在提交时把回车和换行转换成换行,检出时不转换:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global core.autocrlf input
|
$ git config --global core.autocrlf input
|
||||||
|
@ -148,7 +148,7 @@ $ git config --global core.autocrlf input
|
||||||
|
|
||||||
这样在 Windows 上的检出文件中会保留回车和换行,而在 Mac 和 Linux 上,以及版本库中会保留换行。
|
这样在 Windows 上的检出文件中会保留回车和换行,而在 Mac 和 Linux 上,以及版本库中会保留换行。
|
||||||
|
|
||||||
如果你是 Windows 程序员,且正在开发仅运行在 Windows 上的项目,可以设置 `false` 取消此功能,把回车保留在版本库中:
|
如果你是 Windows 程序员,且正在开发仅运行在 Windows 上的项目,可以设置 `false` 取消此功能,把回车保留在版本库中:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global core.autocrlf false
|
$ git config --global core.autocrlf false
|
||||||
|
@ -160,16 +160,16 @@ Git 预先设置了一些选项来探测和修正多余空白字符问题。 它
|
||||||
|
|
||||||
默认被打开的三个选项是:`blank-at-eol`,查找行尾的空格;`blank-at-eof`,盯住文件底部的空行;`space-before-tab`,警惕行头 tab 前面的空格。
|
默认被打开的三个选项是:`blank-at-eol`,查找行尾的空格;`blank-at-eof`,盯住文件底部的空行;`space-before-tab`,警惕行头 tab 前面的空格。
|
||||||
|
|
||||||
默认被关闭的三个选项是:`indent-with-non-tab`,揪出以空格而非 tab 开头的行(你可以用 `tabwidth`选项控制它);`tab-in-indent`,监视在行头表示缩进的 tab;`cr-at-eol`,告诉 Git 忽略行尾的回车。
|
默认被关闭的三个选项是:`indent-with-non-tab`,揪出以空格而非 tab 开头的行(你可以用 `tabwidth`选项控制它);`tab-in-indent`,监视在行头表示缩进的 tab;`cr-at-eol`,告诉 Git 忽略行尾的回车。
|
||||||
|
|
||||||
通过设置 `core.whitespace`,你可以让 Git 按照你的意图来打开或关闭以逗号分割的选项。 要想关闭某个选项,你可以在输入设置选项时不指定它或在它前面加个 `-`。 例如,如果你想要打开除 `cr-at-eol` 之外的所有选项:
|
通过设置 `core.whitespace`,你可以让 Git 按照你的意图来打开或关闭以逗号分割的选项。 要想关闭某个选项,你可以在输入设置选项时不指定它或在它前面加个 `-`。 例如,如果你想要打开除 `cr-at-eol` 之外的所有选项:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --global core.whitespace \
|
$ git config --global core.whitespace \
|
||||||
trailing-space,space-before-tab,indent-with-non-tab
|
trailing-space,space-before-tab,indent-with-non-tab
|
||||||
```
|
```
|
||||||
|
|
||||||
当你运行 `git diff` 命令并尝试给输出着色时,Git 将探测到这些问题,因此你在提交前就能修复它们。 用`git apply` 打补丁时你也会从中受益。 如果正准备应用的补丁存有特定的空白问题,你可以让 Git 在应用补丁时发出警告:
|
当你运行 `git diff` 命令并尝试给输出着色时,Git 将探测到这些问题,因此你在提交前就能修复它们。 用`git apply` 打补丁时你也会从中受益。 如果正准备应用的补丁存有特定的空白问题,你可以让 Git 在应用补丁时发出警告:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git apply --whitespace=warn <patch>
|
$ git apply --whitespace=warn <patch>
|
||||||
|
@ -181,7 +181,7 @@ $ git apply --whitespace=warn <patch>
|
||||||
$ git apply --whitespace=fix <patch>
|
$ git apply --whitespace=fix <patch>
|
||||||
```
|
```
|
||||||
|
|
||||||
这些选项也能运用于 `git rebase`。 如果提交了有空白问题的文件,但还没推送到上游,你可以运行 `git rebase --whitespace=fix` 来让 Git 在重写补丁时自动修正它们。
|
这些选项也能运用于 `git rebase`。 如果提交了有空白问题的文件,但还没推送到上游,你可以运行 `git rebase --whitespace=fix` 来让 Git 在重写补丁时自动修正它们。
|
||||||
|
|
||||||
## 服务器端配置
|
## 服务器端配置
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ Git 服务器端的配置项相对来说并不多,但仍有一些饶有生趣
|
||||||
|
|
||||||
### `receive.fsckObjects`
|
### `receive.fsckObjects`
|
||||||
|
|
||||||
Git 能够确认每个对象的有效性以及 SHA-1 检验和是否保持一致。 但 Git 不会在每次推送时都这么做。这个操作很耗时间,很有可能会拖慢提交的过程,特别是当库或推送的文件很大的情况下。 如果想在每次推送时都要求 Git 检查一致性,设置 `receive.fsckObjects` 为 true 来强迫它这么做:
|
Git 能够确认每个对象的有效性以及 SHA-1 检验和是否保持一致。 但 Git 不会在每次推送时都这么做。这个操作很耗时间,很有可能会拖慢提交的过程,特别是当库或推送的文件很大的情况下。 如果想在每次推送时都要求 Git 检查一致性,设置 `receive.fsckObjects` 为 true 来强迫它这么做:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --system receive.fsckObjects true
|
$ git config --system receive.fsckObjects true
|
||||||
|
@ -199,9 +199,9 @@ $ git config --system receive.fsckObjects true
|
||||||
|
|
||||||
### `receive.denyNonFastForwards`
|
### `receive.denyNonFastForwards`
|
||||||
|
|
||||||
如果你变基已经被推送的提交,继而再推送,又或者推送一个提交到远程分支,而这个远程分支当前指向的提交不在该提交的历史中,这样的推送会被拒绝。 这通常是个很好的策略,但有时在变基的过程中,你确信自己需要更新远程分支,可以在 push 命令后加 `-f` 标志来强制更新(force-update)。
|
如果你变基已经被推送的提交,继而再推送,又或者推送一个提交到远程分支,而这个远程分支当前指向的提交不在该提交的历史中,这样的推送会被拒绝。 这通常是个很好的策略,但有时在变基的过程中,你确信自己需要更新远程分支,可以在 push 命令后加 `-f` 标志来强制更新(force-update)。
|
||||||
|
|
||||||
要禁用这样的强制更新推送(force-pushes),可以设置 `receive.denyNonFastForwards`:
|
要禁用这样的强制更新推送(force-pushes),可以设置 `receive.denyNonFastForwards`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --system receive.denyNonFastForwards true
|
$ git config --system receive.denyNonFastForwards true
|
||||||
|
@ -211,10 +211,10 @@ $ git config --system receive.denyNonFastForwards true
|
||||||
|
|
||||||
### `receive.denyDeletes`
|
### `receive.denyDeletes`
|
||||||
|
|
||||||
有一些方法可以绕过 `denyNonFastForwards` 策略。其中一种是先删除某个分支,再连同新的引用一起推送回该分支。 把 `receive.denyDeletes` 设置为 true 可以把这个漏洞补上:
|
有一些方法可以绕过 `denyNonFastForwards` 策略。其中一种是先删除某个分支,再连同新的引用一起推送回该分支。 把 `receive.denyDeletes` 设置为 true 可以把这个漏洞补上:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git config --system receive.denyDeletes true
|
$ git config --system receive.denyDeletes true
|
||||||
```
|
```
|
||||||
|
|
||||||
这样会禁止通过推送删除分支和标签 — 没有用户可以这么做。 要删除远程分支,必须从服务器手动删除引用文件。 通过用户访问控制列表(ACL)也能够在用户级的粒度上实现同样的功能,你将在 [使用强制策略的一个例子](https://git-scm.com/book/zh/v2/ch00/r_an_example_git_enforced_policy) 一节学到具体的做法。
|
这样会禁止通过推送删除分支和标签 — 没有用户可以这么做。 要删除远程分支,必须从服务器手动删除引用文件。 通过用户访问控制列表(ACL)也能够在用户级的粒度上实现同样的功能,你将在 [使用强制策略的一个例子](https://git-scm.com/book/zh/v2/ch00/r_an_example_git_enforced_policy) 一节学到具体的做法。
|
||||||
|
|
|
@ -18,4 +18,4 @@
|
||||||
|
|
||||||
## 资料
|
## 资料
|
||||||
|
|
||||||
* [https://git-scm.com/downloads](https://git-scm.com/downloads)
|
* [https://git-scm.com/downloads](https://git-scm.com/downloads)
|
||||||
|
|
|
@ -27,11 +27,11 @@ Git 是一个开源的分布式版本控制系统。
|
||||||
|
|
||||||
这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录。
|
这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录。
|
||||||
|
|
||||||
![img](https://git-scm.com/figures/18333fig0102-tn.png)
|
<br><div align="center"><img src="https://git-scm.com/figures/18333fig0102-tn.png"/></div><br>
|
||||||
|
|
||||||
**分布式版本控制系统**的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
|
**分布式版本控制系统**的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
|
||||||
|
|
||||||
![img](https://git-scm.com/figures/18333fig0103-tn.png)
|
<br><div align="center"><img src="https://git-scm.com/figures/18333fig0103-tn.png"/></div><br>
|
||||||
|
|
||||||
### 为什么使用 Git?
|
### 为什么使用 Git?
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值
|
||||||
|
|
||||||
- **已提交(committed)**
|
- **已提交(committed)**
|
||||||
|
|
||||||
已提交表示数据已经安全的保存在本地数据库中。
|
已提交表示数据已经安全的保存在本地数据库中。
|
||||||
|
|
||||||
### 工作区域
|
### 工作区域
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值
|
||||||
|
|
||||||
同理,如果你想同步别人的修改,你需要从远程仓库拉取更新。
|
同理,如果你想同步别人的修改,你需要从远程仓库拉取更新。
|
||||||
|
|
||||||
![git-theory.png](http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-theory.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-theory.png"/></div><br>
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
|
@ -149,15 +149,15 @@ git version 1.7.1
|
||||||
|
|
||||||
## 配置
|
## 配置
|
||||||
|
|
||||||
Git 自带一个 `git config` 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
|
Git 自带一个 `git config` 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
|
||||||
|
|
||||||
1. `/etc/gitconfig` 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 `--system` 选项的 `git config` 时,它会从此文件读写配置变量。
|
1. `/etc/gitconfig` 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 `--system` 选项的 `git config` 时,它会从此文件读写配置变量。
|
||||||
2. `~/.gitconfig` 或 `~/.config/git/config` 文件:只针对当前用户。 可以传递 `--global` 选项让 Git 读写此文件。
|
2. `\~/.gitconfig` 或 `\~/.config/git/config` 文件:只针对当前用户。 可以传递 `--global` 选项让 Git 读写此文件。
|
||||||
3. 当前使用仓库的 Git 目录中的 `config` 文件(就是 `.git/config`):针对该仓库。
|
3. 当前使用仓库的 Git 目录中的 `config` 文件(就是 `.git/config`):针对该仓库。
|
||||||
|
|
||||||
每一个级别覆盖上一级别的配置,所以 `.git/config` 的配置变量会覆盖 `/etc/gitconfig` 中的配置变量。
|
每一个级别覆盖上一级别的配置,所以 `.git/config` 的配置变量会覆盖 `/etc/gitconfig` 中的配置变量。
|
||||||
|
|
||||||
在 Windows 系统中,Git 会查找 `$HOME` 目录下(一般情况下是 `C:\Users\$USER`)的 `.gitconfig` 文件。 Git 同样也会寻找 `/etc/gitconfig` 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。
|
在 Windows 系统中,Git 会查找 `$HOME` 目录下(一般情况下是 `C:\Users\$USER`)的 `.gitconfig` 文件。 Git 同样也会寻找 `/etc/gitconfig` 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。
|
||||||
|
|
||||||
### 用户信息
|
### 用户信息
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ $ git config --global user.name "John Doe"
|
||||||
$ git config --global user.email johndoe@example.com
|
$ git config --global user.email johndoe@example.com
|
||||||
```
|
```
|
||||||
|
|
||||||
再次强调,如果使用了 `--global` 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 `--global` 选项的命令来配置。
|
再次强调,如果使用了 `--global` 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 `--global` 选项的命令来配置。
|
||||||
|
|
||||||
很多 GUI 工具都会在第一次运行时帮助你配置这些信息。
|
很多 GUI 工具都会在第一次运行时帮助你配置这些信息。
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ $ git config --global user.email johndoe@example.com
|
||||||
|
|
||||||
本节选择性介绍 git 中比较常用的命令行场景。
|
本节选择性介绍 git 中比较常用的命令行场景。
|
||||||
|
|
||||||
![git-cheat-sheet.png](http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-cheat-sheet.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-cheat-sheet.png"/></div><br>
|
||||||
|
|
||||||
### 创建
|
### 创建
|
||||||
|
|
||||||
|
@ -458,13 +458,13 @@ HTTPS 这种方式要求你每次 push 时都要输入用户名、密码,有
|
||||||
|
|
||||||
而 SSH 要求你本地生成证书,然后在你的 Github 账户中注册。第一次配置麻烦是麻烦了点,但是以后就免去了每次 push 需要输入用户名、密码的繁琐。
|
而 SSH 要求你本地生成证书,然后在你的 Github 账户中注册。第一次配置麻烦是麻烦了点,但是以后就免去了每次 push 需要输入用户名、密码的繁琐。
|
||||||
|
|
||||||
![image.png](http://upload-images.jianshu.io/upload_images/3101171-66f60822aeb2c21c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-66f60822aeb2c21c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/></div><br>
|
||||||
|
|
||||||
以下介绍以下,如何生成证书,以及在 Github 中注册。
|
以下介绍以下,如何生成证书,以及在 Github 中注册。
|
||||||
|
|
||||||
#### 生成 SSH 公钥
|
#### 生成 SSH 公钥
|
||||||
|
|
||||||
如前所述,许多 Git 服务器都使用 SSH 公钥进行认证。 为了向 Git 服务器提供 SSH 公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份。 这个过程在所有操作系统上都是相似的。 首先,你需要确认自己是否已经拥有密钥。 默认情况下,用户的 SSH 密钥存储在其 `~/.ssh` 目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥:
|
如前所述,许多 Git 服务器都使用 SSH 公钥进行认证。 为了向 Git 服务器提供 SSH 公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份。 这个过程在所有操作系统上都是相似的。 首先,你需要确认自己是否已经拥有密钥。 默认情况下,用户的 SSH 密钥存储在其 `\~/.ssh` 目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cd ~/.ssh
|
$ cd ~/.ssh
|
||||||
|
@ -473,7 +473,7 @@ authorized_keys2 id_dsa known_hosts
|
||||||
config id_dsa.pub
|
config id_dsa.pub
|
||||||
```
|
```
|
||||||
|
|
||||||
我们需要寻找一对以 `id_dsa` 或 `id_rsa` 命名的文件,其中一个带有 `.pub` 扩展名。 `.pub` 文件是你的公钥,另一个则是私钥。 如果找不到这样的文件(或者根本没有 `.ssh` 目录),你可以通过运行 `ssh-keygen` 程序来创建它们。在 Linux/Mac 系统中,`ssh-keygen` 随 SSH 软件包提供;在 Windows 上,该程序包含于 MSysGit 软件包中。
|
我们需要寻找一对以 `id_dsa` 或 `id_rsa` 命名的文件,其中一个带有 `.pub` 扩展名。 `.pub` 文件是你的公钥,另一个则是私钥。 如果找不到这样的文件(或者根本没有 `.ssh` 目录),你可以通过运行 `ssh-keygen` 程序来创建它们。在 Linux/Mac 系统中,`ssh-keygen` 随 SSH 软件包提供;在 Windows 上,该程序包含于 MSysGit 软件包中。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ssh-keygen
|
$ ssh-keygen
|
||||||
|
@ -488,9 +488,9 @@ The key fingerprint is:
|
||||||
d0:82:24:8e:d7:f1:bb:9b:33:53:96:93:49:da:9b:e3 schacon@mylaptop.local
|
d0:82:24:8e:d7:f1:bb:9b:33:53:96:93:49:da:9b:e3 schacon@mylaptop.local
|
||||||
```
|
```
|
||||||
|
|
||||||
首先 `ssh-keygen` 会确认密钥的存储位置(默认是 `.ssh/id_rsa`),然后它会要求你输入两次密钥口令。如果你不想在使用密钥时输入口令,将其留空即可。
|
首先 `ssh-keygen` 会确认密钥的存储位置(默认是 `.ssh/id_rsa`),然后它会要求你输入两次密钥口令。如果你不想在使用密钥时输入口令,将其留空即可。
|
||||||
|
|
||||||
现在,进行了上述操作的用户需要将各自的公钥发送给任意一个 Git 服务器管理员(假设服务器正在使用基于公钥的 SSH 验证设置)。 他们所要做的就是复制各自的 `.pub` 文件内容,并将其通过邮件发送。 公钥看起来是这样的:
|
现在,进行了上述操作的用户需要将各自的公钥发送给任意一个 Git 服务器管理员(假设服务器正在使用基于公钥的 SSH 验证设置)。 他们所要做的就是复制各自的 `.pub` 文件内容,并将其通过邮件发送。 公钥看起来是这样的:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cat ~/.ssh/id_rsa.pub
|
$ cat ~/.ssh/id_rsa.pub
|
||||||
|
@ -508,7 +508,7 @@ NrRFi9wrf+M7Q== schacon@mylaptop.local
|
||||||
|
|
||||||
后面,你在克隆你的 Github 项目时使用 SSH 方式即可。
|
后面,你在克隆你的 Github 项目时使用 SSH 方式即可。
|
||||||
|
|
||||||
![The key field](https://help.github.chttps://raw.githubusercontent.com/dunwu/design/master/images/refactor/help/settings/ssh-key-paste.png)
|
<br><div align="center"><img src="https://help.github.chttps://raw.githubusercontent.com/dunwu/design/master/images/refactor/help/settings/ssh-key-paste.png"/></div><br>
|
||||||
|
|
||||||
如果觉得我的讲解还不够细致,可以参考:https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/
|
如果觉得我的讲解还不够细致,可以参考:https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/
|
||||||
|
|
||||||
|
@ -516,7 +516,7 @@ NrRFi9wrf+M7Q== schacon@mylaptop.local
|
||||||
|
|
||||||
最后,放一张我总结的脑图总结一下以上的知识点。
|
最后,放一张我总结的脑图总结一下以上的知识点。
|
||||||
|
|
||||||
![Git.png](http://upload-images.jianshu.io/upload_images/3101171-2044cc669d78eef9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-2044cc669d78eef9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/></div><br>
|
||||||
|
|
||||||
## 资料
|
## 资料
|
||||||
|
|
||||||
|
|
|
@ -177,7 +177,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
>
|
>
|
||||||
> \> 如果你认为单词是由 blank 字符分隔符,那么你需要使用大写的 E 和 W。(注:程序语句)
|
> \> 如果你认为单词是由 blank 字符分隔符,那么你需要使用大写的 E 和 W。(注:程序语句)
|
||||||
>
|
>
|
||||||
> ![Word moves example](http://upload-images.jianshu.io/upload_images/3101171-46f752c581d79057.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-46f752c581d79057.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/></div><br>
|
||||||
|
|
||||||
下面,让我来说说最强的光标移动:
|
下面,让我来说说最强的光标移动:
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
> - `t,` → 到逗号前的第一个字符。逗号可以变成其它字符。
|
> - `t,` → 到逗号前的第一个字符。逗号可以变成其它字符。
|
||||||
> - `3fa` → 在当前行查找第三个出现的 a。
|
> - `3fa` → 在当前行查找第三个出现的 a。
|
||||||
> - `F` 和 `T` → 和 `f` 和 `t` 一样,只不过是相反方向。
|
> - `F` 和 `T` → 和 `f` 和 `t` 一样,只不过是相反方向。
|
||||||
> ![Line moves](http://upload-images.jianshu.io/upload_images/3101171-00835b8316330c58.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-00835b8316330c58.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/></div><br>
|
||||||
|
|
||||||
还有一个很有用的命令是 `dt"` → 删除所有的内容,直到遇到双引号—— `"。`
|
还有一个很有用的命令是 `dt"` → 删除所有的内容,直到遇到双引号—— `"。`
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
> - `v2i)` → 会选择 `map (+) ("foo")`
|
> - `v2i)` → 会选择 `map (+) ("foo")`
|
||||||
> - `v2a)` → 会选择 `(map (+) ("foo"))`
|
> - `v2a)` → 会选择 `(map (+) ("foo"))`
|
||||||
|
|
||||||
![Text objects selection](http://upload-images.jianshu.io/upload_images/3101171-0b109d66a6111c83.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-0b109d66a6111c83.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/></div><br>
|
||||||
|
|
||||||
#### 块操作: `<C-v>`
|
#### 块操作: `<C-v>`
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
- `<C-d>` → 向下移动 (你也可以使用 hjkl 来移动光标,或是使用%,或是别的)
|
- `<C-d>` → 向下移动 (你也可以使用 hjkl 来移动光标,或是使用%,或是别的)
|
||||||
- `I-- [ESC]` → I 是插入,插入“`--`”,按 ESC 键来为每一行生效。
|
- `I-- [ESC]` → I 是插入,插入“`--`”,按 ESC 键来为每一行生效。
|
||||||
|
|
||||||
![Rectangular blocks](http://upload-images.jianshu.io/upload_images/3101171-8b093a0f65707949.gif?imageMogr2/auto-orient/strip)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-8b093a0f65707949.gif?imageMogr2/auto-orient/strip"/></div><br>
|
||||||
|
|
||||||
在 Windows 下的 vim,你需要使用 `<C-q>` 而不是 `<C-v>` ,`<C-v>` 是拷贝剪贴板。
|
在 Windows 下的 vim,你需要使用 `<C-q>` 而不是 `<C-v>` ,`<C-v>` 是拷贝剪贴板。
|
||||||
|
|
||||||
|
@ -267,7 +267,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
|
|
||||||
在 Insert 模式下,你可以输入一个词的开头,然后按 `<C-p>或是<C-n>,自动补齐功能就出现了……`
|
在 Insert 模式下,你可以输入一个词的开头,然后按 `<C-p>或是<C-n>,自动补齐功能就出现了……`
|
||||||
|
|
||||||
``![Completion](http://upload-images.jianshu.io/upload_images/3101171-e2ae877e67880ff7.gif?imageMogr2/auto-orient/strip)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-e2ae877e67880ff7.gif?imageMogr2/auto-orient/strip"/></div><br>
|
||||||
|
|
||||||
#### 宏录制: `qa` 操作序列 `q`, `@a`, `@@`
|
#### 宏录制: `qa` 操作序列 `q`, `@a`, `@@`
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
>
|
>
|
||||||
> - 现在做 `100@@` 会创建新的 100 行,并把数据增加到 103.
|
> - 现在做 `100@@` 会创建新的 100 行,并把数据增加到 103.
|
||||||
|
|
||||||
![Macros](http://upload-images.jianshu.io/upload_images/3101171-f1889f8bca723964.gif?imageMogr2/auto-orient/strip)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-f1889f8bca723964.gif?imageMogr2/auto-orient/strip"/></div><br>
|
||||||
|
|
||||||
#### 可视化选择: `v`,`V`,`<C-v>`
|
#### 可视化选择: `v`,`V`,`<C-v>`
|
||||||
|
|
||||||
|
@ -306,7 +306,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
- `<` 或 `>` → 左右缩进
|
- `<` 或 `>` → 左右缩进
|
||||||
- `=` → 自动给缩进 (注:这个功能相当强大,我太喜欢了)
|
- `=` → 自动给缩进 (注:这个功能相当强大,我太喜欢了)
|
||||||
|
|
||||||
![Autoindent](http://upload-images.jianshu.io/upload_images/3101171-fe1e19983fca213f.gif?imageMogr2/auto-orient/strip)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-fe1e19983fca213f.gif?imageMogr2/auto-orient/strip"/></div><br>
|
||||||
|
|
||||||
在所有被选择的行后加上点东西:
|
在所有被选择的行后加上点东西:
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
- `$` 到行最后
|
- `$` 到行最后
|
||||||
- `A`, 输入字符串,按 `ESC。`
|
- `A`, 输入字符串,按 `ESC。`
|
||||||
|
|
||||||
![Append to many lines](http://upload-images.jianshu.io/upload_images/3101171-b192601247334c4e.gif?imageMogr2/auto-orient/strip)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-b192601247334c4e.gif?imageMogr2/auto-orient/strip"/></div><br>
|
||||||
|
|
||||||
#### 分屏: `:split` 和 `vsplit`.
|
#### 分屏: `:split` 和 `vsplit`.
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
> - `<C-w>_` (或 `<C-w>|`) : 最大化尺寸 (<C-w>| 垂直分屏)
|
> - `<C-w>_` (或 `<C-w>|`) : 最大化尺寸 (<C-w>| 垂直分屏)
|
||||||
> - `<C-w>+` (或 `<C-w>-`) : 增加尺寸
|
> - `<C-w>+` (或 `<C-w>-`) : 增加尺寸
|
||||||
|
|
||||||
![Split](http://upload-images.jianshu.io/upload_images/3101171-f329d01e299cb366.gif?imageMogr2/auto-orient/strip)
|
<br><div align="center"><img src="http://upload-images.jianshu.io/upload_images/3101171-f329d01e299cb366.gif?imageMogr2/auto-orient/strip"/></div><br>
|
||||||
|
|
||||||
## 3. Vim Cheat Sheet
|
## 3. Vim Cheat Sheet
|
||||||
|
|
||||||
|
@ -338,33 +338,33 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错
|
||||||
|
|
||||||
此外,[这里](http://blog.ngedit.com/vi-vim-cheat-sheet-sch.gif)还有简体中文版。
|
此外,[这里](http://blog.ngedit.com/vi-vim-cheat-sheet-sch.gif)还有简体中文版。
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet.png"/></div><br>
|
||||||
|
|
||||||
### 3.2. 入门版
|
### 3.2. 入门版
|
||||||
|
|
||||||
基本操作的入门版。[原版出处](https://github.com/ahrencode/Miscellaneous)还有 keynote 版本可供 DIY 以及其他相关有用的 cheatsheet。
|
基本操作的入门版。[原版出处](https://github.com/ahrencode/Miscellaneous)还有 keynote 版本可供 DIY 以及其他相关有用的 cheatsheet。
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/vim/basic-vim-cheat-sheet.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/vim/basic-vim-cheat-sheet.png"/></div><br>
|
||||||
|
|
||||||
### 3.3. 进阶版
|
### 3.3. 进阶版
|
||||||
|
|
||||||
下图是 300DPI 的超清大图,另外[查看原文](http://michael.peopleofhonoronly.com/vim/)还有更多版本:黑白,低分辨率,色盲等
|
下图是 300DPI 的超清大图,另外[查看原文](http://michael.peopleofhonoronly.com/vim/)还有更多版本:黑白,低分辨率,色盲等
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-for-programmers.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-for-programmers.png"/></div><br>
|
||||||
|
|
||||||
### 3.4. 增强版
|
### 3.4. 增强版
|
||||||
|
|
||||||
下图是一个更新时间较新的现代版,含有的信息也更丰富。[原文链接](http://vimcheatsheet.com/)
|
下图是一个更新时间较新的现代版,含有的信息也更丰富。[原文链接](http://vimcheatsheet.com/)
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-02.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-02.png"/></div><br>
|
||||||
|
|
||||||
### 3.5. 文字版
|
### 3.5. 文字版
|
||||||
|
|
||||||
[原文链接](http://tnerual.eriogerg.free.fr/vimqrc.pdf)
|
[原文链接](http://tnerual.eriogerg.free.fr/vimqrc.pdf)
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-text-01.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-text-01.png"/></div><br>
|
||||||
|
|
||||||
![](http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-text-02.png)
|
<br><div align="center"><img src="http://dunwu.test.upcdn.net/images/os/vim/vim-cheat-sheet-text-02.png"/></div><br>
|
||||||
|
|
||||||
## 4. 资料
|
## 4. 资料
|
||||||
|
|
||||||
|
|
|
@ -29,22 +29,22 @@
|
||||||
|
|
||||||
> [Everything](http://www.voidtools.com/) 可以立即在 windows 系统中找到制定名称的文件和文件夹。
|
> [Everything](http://www.voidtools.com/) 可以立即在 windows 系统中找到制定名称的文件和文件夹。
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180930174548.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920180930174548.png"/></div><br>
|
||||||
|
|
||||||
### 1.3. Wox
|
### 1.3. Wox
|
||||||
|
|
||||||
> [Wox](https://github.com/Wox-launcher/Wox) 是一款简单易用的 Windows 启动器。可以把它视为 windows 版的 Alfred。
|
> [Wox](https://github.com/Wox-launcher/Wox) 是一款简单易用的 Windows 启动器。可以把它视为 windows 版的 Alfred。
|
||||||
|
|
||||||
![](https://camo.githubusercontent.com/9db33546d3a905a9ad915e0948d3ba3f47f57b64/687474703a2f2f692e696d6775722e636f6d2f4474784e424a692e676966)
|
<br><div align="center"><img src="https://camo.githubusercontent.com/9db33546d3a905a9ad915e0948d3ba3f47f57b64/687474703a2f2f692e696d6775722e636f6d2f4474784e424a692e676966"/></div><br>
|
||||||
|
|
||||||
### 1.4. Q-dir
|
### 1.4. Q-dir
|
||||||
|
|
||||||
> [Q-dir](http://www.softpedia.com/get/File-managers/Q-Dir.shtml) 是轻量的文件管理器,特点鲜明,各种布局视图切换灵活,默认四个小窗口组成一个大窗口,操作快捷。
|
> [Q-dir](http://www.softpedia.com/get/File-managers/Q-Dir.shtml) 是轻量的文件管理器,特点鲜明,各种布局视图切换灵活,默认四个小窗口组成一个大窗口,操作快捷。
|
||||||
|
|
||||||
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180930174437.png)
|
<br><div align="center"><img src="http://oyz7npk35.bkt.clouddn.com/images/20180920180930174437.png"/></div><br>
|
||||||
|
|
||||||
### 1.5. Fences
|
### 1.5. Fences
|
||||||
|
|
||||||
> [Fences](https://www.stardock.com/products/fences/) 也被称为栅栏桌面,是著名的 Stardock 公司推出的一款软件,用来分类和组织桌面上的图标一款软件。
|
> [Fences](https://www.stardock.com/products/fences/) 也被称为栅栏桌面,是著名的 Stardock 公司推出的一款软件,用来分类和组织桌面上的图标一款软件。
|
||||||
|
|
||||||
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538311775699&di=70a9d04f067844d1881031761b6ca67c&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-vo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2F962bd40735fae6cd16fbebdb0eb30f2442a70f38.jpg)
|
<br><div align="center"><img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538311775699&di=70a9d04f067844d1881031761b6ca67c&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-vo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2F962bd40735fae6cd16fbebdb0eb30f2442a70f38.jpg"/></div><br>
|
||||||
|
|
Loading…
Reference in New Issue