Blog

mac软件问题和优化-自定义terminal主题

一、添加terminal新主题

在这篇博客中,我将把Solarized-Dark主题添加到我们的终端。下载好*.terminal然后直接用终端terminal打开就算主题安装好了。在终端的菜单属性栏可以指定主题。

Note: You can download various Themes (.terminal files) from this git repo. Simply open the *.terminal file to install it, i.e. right-click on the *.terminal file > “open with" > Terminal

  1. Go to http://ethanschoonover.com/solarized
  2. Scroll down and download the Theme (solarized.zip)
  3. Extract the solarized.zip file
  4. Open the osx-terminal.app-colors-solarized folder. This folder contains Theme for the terminal.
  5. Double click “Solarized Dark ansi.terminal” file — This is the specific Theme file for Terminal.app. Note: If you get a warning that this is from an unidentified developer, Right-click on the file and select “Open with” > Terminal option.
  6. At this point, you have the Theme installed into your Terminal. We just need to make it a default Theme.
  7. Open Terminal > Preferences > Text and select the “Solarized Dark …” theme and click on “Default”.

二、安装  Powerline

Powerline是一个Python应用程序,是vim的状态行插件,为几个其他应用程序提供状态行和提示,包括zsh,bash,tmux,IPython,Awesome和Qtile。

1、安装Python【mac系统默认已经安装好了】

通过python -V在终端中输入确保Python的版本是2.7.x.

  • 如果它不是2.7,请安装Homebrew,允许我们通过运行以下命令从CLI安装各种软件:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 运行brew install python以通过Homebrew安装最新的Python

2、安装pip – Python的包管理器(类似于npm)

通过运行$ sudo easy_install pip  来安装pip。
出现ssl下载错误的话,可以用下面的方法安装pip:
根据网站https://pip.readthedocs.io/en/stable/installing/  提示:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py

3、安装 command line developer tools

从App Store上下载Xcode后,默认是不会安装Command Line Tools的。Command Line Tools是Xcode中的一款工具,可以在命令行中运行C程序,同时又为其他软件提供操作系统服务的功能。

Command Line Tools【又叫 XCode Developer CLI tools】are used by Powerline and other apps that manipulate core OSX features. So make sure to install the XCode CLI tools by running the following command.

现在也来学习一下如何安装Command Line Tools:

方法一:Terminal 运行 xcode-select --install 然后点击安装
方法二:登录https://developer.apple.com/download/more/ 然后下载 dmg 安装
坑爹提醒: 网上复制粘贴这个 xcode-select —-install 到终端出现报错,仔细一看命令行居然是  – 和— 两个不同的破折号。

检验是否安装完成:

cooldeMacBook-Pro:~ cool$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

或者:在xcode 中创建 OSX 的Application 项目时有 command line tool 选项。

4、安装Powerline

$ pip install --user powerline-status

添加powerline 后台进程 到bash,用于监控终端并及时作出响应。
(1)pip show powerline-status知道powerline安装目录。
(2)修改环境变量:

export PATH=$PATH:$HOME/Library/Python/2.7/bin
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /Users/rupa/Library/Python/2.7/lib/python/site-packages/powerline/bindings/bash/powerline.sh

(3)生效环境变量
source ~/.bash_profile

三、 Powerline 与 本地化问题

打开终端后发现:

 File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 475, in _parse_localename
    raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8

查看问题 ‘unknown locale: %s’ % localename
解决办法是:在 .bash_profile 调用powerline之前就先添加上 本地化变量:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

我的 .bash_profile 最终配置如下:

### 下面设置的本地化变量  是为了解决powerline 本地化报错问题,变量一定要在powerline运行前调用 
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

export PATH=$PATH:$HOME/Library/Python/2.7/bin
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /Users/cool/Library/Python/2.7/lib/python/site-packages/powerline/bindings/bash/powerline.sh

 

四、 安装 Powerline 字体

To install Powerline fonts, simply go to https://github.com/powerline/fonts. There you’ll see a whole bunch of folders. Each one is a font, aka “Patched fonts”.

It is called “Patched fonts” because people have taken regular fonts and have added/patched additional Powerline specific icons and fonts to them.

1、下载整个repo 仓库并解压。

(1)Click on the “Clone or download” button and download the whole repo so you try various fonts.
(2)Unzip the fonts-master.zip

字体安装双击 .ttf 文件就行,然后在终端的属性中进行选择。

Let’s open Meslo dotted fonts folder. It will look like below. You’ll see a whole bunch of .ttf file. Each one of them is a font but some are “bold” version of the font, some are “regular” version and so on.

Simply double-click on the .ttf file and press “Install font” to install the font on your computer.

For our case, let’s install “Meslo LG L DZ Regular for Powerline.ttf” and “Meslo LG L DZ Italic for Powerline.ttf”. This will add a regular and an Italic version of the Meslo font.

五、 安装 powerline的gitstatus插件

1、安装 powerline-gitstatus

pip install --user powerline-gitstatus

Note: “– user” command is required to install it in the user’s profile.

2、配置gitstatus 颜色显示

Add powerline-gitstatus color schemes to Powerline
(1)打开 colorschemes/shell/default.json 文件

${powerline-install-directory}/powerline/config_files/colorschemes/shell/default.json
//For example:
/Users/rupa/Library/Python/2.7/lib/python/site-packages/powerline/config_files/colorschemes/shell/default.json

(2) 添加各gitstatus 状态的颜色配置

{
  "groups": {
    "gitstatus":                 { "fg": "gray8",           "bg": "gray2", "attrs": [] },
    "gitstatus_branch":          { "fg": "gray8",           "bg": "gray2", "attrs": [] },
    "gitstatus_branch_clean":    { "fg": "green",           "bg": "gray2", "attrs": [] },
    "gitstatus_branch_dirty":    { "fg": "gray8",           "bg": "gray2", "attrs": [] },
    "gitstatus_branch_detached": { "fg": "mediumpurple",    "bg": "gray2", "attrs": [] },
    "gitstatus_tag":             { "fg": "darkcyan",        "bg": "gray2", "attrs": [] },
    "gitstatus_behind":          { "fg": "gray10",          "bg": "gray2", "attrs": [] },
    "gitstatus_ahead":           { "fg": "gray10",          "bg": "gray2", "attrs": [] },
    "gitstatus_staged":          { "fg": "green",           "bg": "gray2", "attrs": [] },
    "gitstatus_unmerged":        { "fg": "brightred",       "bg": "gray2", "attrs": [] },
    "gitstatus_changed":         { "fg": "mediumorange",    "bg": "gray2", "attrs": [] },
    "gitstatus_untracked":       { "fg": "brightestorange", "bg": "gray2", "attrs": [] },
    "gitstatus_stashed":         { "fg": "darkblue",        "bg": "gray2", "attrs": [] },
    "gitstatus:divider":         { "fg": "gray8",           "bg": "gray2", "attrs": [] }
  }
}

(3)激活gitstatus插件
Open Theme’s default.json file

${powerline-install-directory}/powerline/config_files/themes/shell/default.json
//For example:
/Users/rupa/Library/Python/2.7/lib/python/site-packages/powerline/config_files/themes/shell/default.json

Add the following to the default.json

{
    "function": "powerline_gitstatus.gitstatus",
    "priority": 40
}

(4)重启powerline后台进程
Save the file and run the following: powerline-daemon --replace in the Terminal.

Important Note: Every time you make changes to Powerline’s config, in addition to restarting the Terminal, you’ll also need to restart the daemon to see the changes reflected by running: powerline-daemon —-replace.

(5)重启终端,一切搞定

mac特有软件-Homebrew软件包管理器

一、安装homebrew

  • MacOS comes with Python installed already. Ensure Python’s version is 2.7.x by typing python -V in the Terminal.
  • If it’s not 2.7, install Homebrew that allows us to install various software from the CLI, by running:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Run brew install python to install the latest Python via Homebrew

安装pip

brew install pip
后来出现报错:提示

Error: No available formula with the name "pip" 
Homebrew provides pip via: `brew install python`. However you will then
have two Pythons installed on your Mac, so alternatively you can install
pip via the instructions at:
  https://pip.readthedocs.io/en/stable/installing/
cooldeMacBook-Pro:~ cool$

打开网页:显示操作
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py

二、Homebrew设置代理

homebrew 使用 curl 下载的,所以只要 设置 curl的代理就可以了:

### 新建 .curlrc 文件
cooldeMacBook-Pro:~ cool$ vim  ~/.curlrc
### 编辑 代理内容 并保存退出
socks5 = 127.0.0.1:1086
##  代理内容的地址 其实也可以加上双引号
socks5 = "127.0.0.1:1080"


### 查看代理结果:

liuzhizhi@lzz-rmbp|logs # curl ip.cn
当前 IP:114.110.1.38 来自:北京市 广东恒敦通信技术北京分公司

liuzhizhi@lzz-rmbp|~ # curl cip.cc
IP  : 114.110.1.38
地址  : 中国  北京市
数据二 : 北京市 | 广东恒敦通信技术北京分公司
URL : http://www.cip.cc/114.110.1.38

liuzhizhi@lzz-rmbp|~ # curl myip.ipip.net
当前 IP:114.110.1.38  来自于:中国 北京 北京 联通/电信

三、Homebrew设置镜像源

  • 替换brew.git:
    cd "$(brew --repo)"
    git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
  • 替换homebrew-core.git:
    cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
    git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
  • 替换Homebrew Bottles源:
    就是在/.bashrc或者/.zshrc文件末尾加

    export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles
    

    这两个文件可以自己创建,/.bashrc和/.bash_profile都可以

四、重置源

  • 重置brew.git
    cd "$(brew --repo)"
    git remote set-url origin https://github.com/Homebrew/brew.git
  • 重置homebrew-core:
    cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
    git remote set-url origin https://github.com/Homebrew/homebrew-core.git
    

     

参考:https://www.jianshu.com/p/005963a4d843

git基础-(2)-历史记录和版本恢复

先再新建一个提交记录,记录数多了,这样方便查询历史记录。

cooldeMacBook-Pro:git-learn cool$ vim a.text
cooldeMacBook-Pro:git-learn cool$ git commit -m "for history" a.text
[master d729d2f] for history
 1 file changed, 1 insertion(+), 1 deletion(-)
cooldeMacBook-Pro:git-learn cool$

一、git log当前游标下历史记录

就是指 如果历史版本有8个,当前游标下恢复成第5个版本,那么git log 显示的记录只能看到 1-5版本,无法显示 之后的 6 -8 版本。

1、git log

cooldeMacBook-Pro:git-learn cool$ git log
commit d729d2f2ca7c2ae0e13d02b6667fb4154d7f3726
Author: test <[email protected]>
Date:   Sun Oct 28 17:44:47 2018 +0800

    for history

commit 4e8507389695dc3061a9dfe101a0325594e8b164
Author: test <[email protected]>
Date:   Sun Oct 28 17:38:23 2018 +0800

    Second commit

commit 7f4008f0e72ad3d47c4cfc7916870fe91ae0ae51
Author: test <[email protected]>
Date:   Sun Oct 28 17:16:09 2018 +0800

    hh

commit b857e6bf3b44bba35c88c77139ae0c0e0cd2b182
Author: test <[email protected]>
Date:   Sun Oct 28 16:52:21 2018 +0800

    first submit a.text
:

=======================================================
【git log 信息下面若是 光标带冒号,按空格键可以翻页】
多屏显示控制方式:
空格向下翻页
b 向上翻页
q 退出

commit d729d2f2ca7c2ae0e13d02b6667fb4154d7f3726  代表 提交hash值

2、git log –pretty=oneline【解决输出日志信息太多问题】

cooldeMacBook-Pro:git-learn cool$ git log --pretty=oneline
d729d2f2ca7c2ae0e13d02b6667fb4154d7f3726 for history
4e8507389695dc3061a9dfe101a0325594e8b164 Second commit
7f4008f0e72ad3d47c4cfc7916870fe91ae0ae51 hh
b857e6bf3b44bba35c88c77139ae0c0e0cd2b182 first submit a.text
cooldeMacBook-Pro:git-learn cool$ 

3、git log –oneline【解决输出日志信息太多问题】

cooldeMacBook-Pro:git-learn cool$ git log --oneline
d729d2f for history
4e85073 Second commit
7f4008f hh
b857e6b first submit a.text
cooldeMacBook-Pro:git-learn cool$ 

二、git reflog 显示项目所有历史记录

cooldeMacBook-Pro:git-learn cool$ git reflog
d729d2f HEAD@{0}: commit: for history
4e85073 HEAD@{1}: commit: Second commit
7f4008f HEAD@{2}: commit: hh
b857e6b HEAD@{3}: commit (initial): first submit a.text
cooldeMacBook-Pro:git-learn cool$ 

HEAD@{移动到当前版本需要多少步}

三、历史版本恢复

1、先根据 git 历史记录 找到游标【head】对应的 hash 局部索引值。

cooldeMacBook-Pro:git-learn cool$ git reflog
d729d2f HEAD@{0}: commit: for history
4e85073 HEAD@{1}: commit: Second commit
7f4008f HEAD@{2}: commit: hh
b857e6b HEAD@{3}: commit (initial): first submit a.text
cooldeMacBook-Pro:git-learn cool$ 

HEAD@{移动到当前版本需要多少步}

2、选择历史版本进行恢复

(1)git reset --hard [局部索引值]

cooldeMacBook-Pro:git-learn cool$ git reset --hard 7f4008f
HEAD is now at 7f4008f hh

(2)或者使用^符号:只能后退
git reset --hard HEAD^
注:在当前游标下,一个^表示后退一步,n个^表示后退n步

(3)或者使用~符号:只能后退
git reset --hard HEAD~n
注:表示 当前游标下 后退n 步

四、恢复到上一次提交记录

控制台直接输入: git reset --hard 就可以恢复到最近的一次提交记录。

cooldeMacBook-Pro:git-learn cool$ vim a.text
cooldeMacBook-Pro:git-learn cool$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   a.text

no changes added to commit (use "git add" and/or "git commit -a")
cooldeMacBook-Pro:git-learn cool$ git reset --hard
HEAD is now at 7f4008f hh
cooldeMacBook-Pro:git-learn cool$ git status
On branch master
nothing to commit, working directory clean
cooldeMacBook-Pro:git-learn cool$

一开始 工作区 、暂存区 和本地仓库 都是相同的,后来修改了a.text。然后用git status 查看,说可以去提交了。这个时候,输入git reset --hard 发现工作区和暂存区和本地仓库,都恢复到了最近的一次提交记录上去了。工作区中的a.text 的修改信息已被删除,文件已经还原到最近一次的提交记录。

同理git reset --soft  其实没有效果,git reset --mixed 其实就是移除了那些之前添加到暂存区的文件。

五、git reset --soft|mixed|hard

  • –soft 参数
    • 仅仅在本地库移动 HEAD 指针
  • –mixed 参数
    • 在本地库移动 HEAD 指针
    • 重置暂存区【暂存区官方文档也叫 index file】
  • –hard 参数
    • 在本地库移动 HEAD 指针
    • 重置暂存区【暂存区官方文档也叫 index file】
    • 重置工作区

六、删除文件找回

git 的文件删除操作,也要提交记录到本地仓库,这样才能算真正记录了文件删除。

1、新在工作区中将之前提交过的文件进行删除

cooldeMacBook-Pro:git-learn cool$ git status
On branch master
nothing to commit, working tree clean
cooldeMacBook-Pro:git-learn cool$ ls
a.text	bbb.txt
cooldeMacBook-Pro:git-learn cool$ rm bbb.txt
cooldeMacBook-Pro:git-learn cool$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    bbb.txt

no changes added to commit (use "git add" and/or "git commit -a")
cooldeMacBook-Pro:git-learn cool$ 

===================================

新建了两个文件,然后将两个文件都提交到了本地仓库。
接着其中删了一个,查看git status发现有文件删除,需要提交记录到暂存区或者直接提交到本地仓库

2、接下来将删除文件记录添加到暂存区:

cooldeMacBook-Pro:git-learn cool$ git add bbb.txt
cooldeMacBook-Pro:git-learn cool$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	deleted:    bbb.txt

cooldeMacBook-Pro:git-learn cool$ 

========================================
将 bbb.txt 的删除记录 添加到了 暂存区,并显示 git status 状态

3、最后将删除文件记录提交到 本地仓库:

cooldeMacBook-Pro:git-learn cool$ git commit -m "bbb.txt has been deleted" bbb.txt
[master 7719e56] bbb.txt has been deleted
 1 file changed, 2 deletions(-)
 delete mode 100644 bbb.txt
cooldeMacBook-Pro:git-learn cool$ git status
On branch master
nothing to commit, working tree clean
cooldeMacBook-Pro:git-learn cool$ ls
a.text
cooldeMacBook-Pro:git-learn cool$ 

恢复已删除文件的前提:删除前,文件存在时的状态已提交到了本地库。

操作:git reset –hard [指针位置]
①删除操作已经提交到本地库:指针位置指向历史记录
git reset --hard [八位hash值,比如:7f4008f]
②删除操作尚未提交到本地库:指针位置使用HEAD
git reset --hard head 或者可以直接输入  git reset --hard

git基础-(1)-基本操作git init | git config | git status | git add | git commit

一、git init

git init 初始化git本地仓库,即在当前目录下创建 .git 文件夹【也就是隐藏目录】

cooldeMacBook-Pro:test cool$ git init
Initialized empty Git repository in /Users/cool/Documents/test/.git/
cooldeMacBook-Pro:test cool$ ls .git
HEAD		config		hooks		objects
branches	description	info		refs
cooldeMacBook-Pro:test cool$ 

二、git config

git config 创建签名,用来区分不同开发人员的身份。
用户名:tom
Email 地址:[email protected] 【不会发送邮件,只填用户名也可以】

1、创建签名(和修改签名操作一样)

项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name tom_pro
git config user.email [email protected]
信息保存位置:./.git/config 文件

系统用户级别:登录当前操作系统的用户范围
git config --global user.name tom_glb
git config --global user.email  [email protected]
信息保存位置:~/.gitconfig 文件

2、签名级别优先级

就近原则:
(1)项目级别优先于系统用户级别,二者都有时采用项目级别的签名。
(2)如果只有系统用户级别的签名,就以系统用户级别的签名为准。
(3)二者都没有不允许。

3、查看和修改签名

查看自己的用户名和邮箱地址:
  $ git config user.name
  $ git config user.email

修改自己的用户名和邮箱地址:
  $ git config --global user.name "xxx"
  $ git config --global user.email "xxx"

辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。

三、git status

用于查看工作区、暂存区状态。

举例:
在工作区创建a.text文件【.DS_Store是mac自带文件】,然后输入git status

cooldeMacBook-Pro:git-learn cool$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.DS_Store
	a.text

nothing added to commit but untracked files present (use "git add" to track)

On branch master 就是在项目主干上,
Untracked files: 就是未跟踪的文件,也就是那些在工作区却还没有在暂存区中的文件。
nothing added to commit but untracked files present暂存区没有可提交的文件,除了那些还没有放到暂存区【即还没有被跟踪的】的文件。

四、git add

将工作区“新建/修改”过的文件添加到暂存区。

举例:
新建了a.text ,然后输入git add a.text将a.text 添加到暂存区。接着再输入git status

cooldeMacBook-Pro:git-learn cool$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   a.text

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.DS_Store

最后又输入 git rm --cached a.text 将a.text 从暂存区中移除。

cooldeMacBook-Pro:git-learn cool$ git rm --cached a.text
rm 'a.text'
cooldeMacBook-Pro:git-learn cool$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.DS_Store
	a.text

nothing added to commit but untracked files present (use "git add" to track)
cooldeMacBook-Pro:git-learn cool$

五、git commit

将暂存区的内容提交到本地库

1、方法 git commit [file name]会调用 vim 编辑器
补充: vim中显示行号命令 :set nu

举例:
暂存区a.text文件提交到本地仓库: git commit a.text 会调用 vim 编辑器
### vim显示行号命令 :set nu

  1 first submit a.text【这句话是自己写的提交信息,下面的文字是默认存在的】
  2 # Please enter the commit message for your changes. Lines starting
  3 # with '#' will be ignored, and an empty message aborts the commit.
  4 # Explicit paths specified without -i or -o; assuming --only paths...
  5 # On branch master
  6 #
  7 # Initial commit
  8 #
  9 # Changes to be committed:
 10 #       new file:   a.text
 11 #
 12 # Untracked files:
 13 #       .DS_Store
 14 #
~                                                                               
~                                                                               
~                                                                               
~                                                                           
-- INSERT --

文件保存好以后,控制台显示信息:

cooldeMacBook-Pro:git-learn cool$ git commit a.text
[master (root-commit) b857e6b] first submit a.text     
 1 file changed, 6 insertions(+)
 create mode 100644 a.text
cooldeMacBook-Pro:git-learn cool$

=============================================
master (root-commit) 代表主干根提交
b857e6b 相当于版本号
first submit a.text 代表提交备注
1 file changed, 6 insertions(+) 一个文件被修改 增加了三行

2、方法 git commit -m "commit message" [file name]

六、文件修改更新后的操作

举例:
当在工作区修改了a.text文件后,查看状态 git status

cooldeMacBook-Pro:git-learn cool$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   a.text

no changes added to commit (use "git add" and/or "git commit -a")
cooldeMacBook-Pro:git-learn cool$

========================================================
Changes not staged for commit: 指修改的文件没有 添加到缓存区
"git checkout -- ...  to discard changes in working directory 指恢复历史记录,取消在工作区中的修改。

no changes added to commit (use "git add" and/or "git commit -a") 
指缓存区 还没有添加修改信息 可以先 git add 然后 git commit -a 或者直接 git commit -a【这里的 -a 不是和 a.text 的文件名没有任何关系】

将修改的文件提交到缓存区,然后查看状态:

cooldeMacBook-Pro:git-learn cool$ git add a.text
cooldeMacBook-Pro:git-learn cool$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   a.text

cooldeMacBook-Pro:git-learn cool$ 

=============================================== 
 (use "git reset HEAD <file>..." to unstage)   代表:将缓存区的 文件重新去除

将修改过的已经添加到暂存区的a.text 提交,然后查看状态:

cooldeMacBook-Pro:git-learn cool$ git commit -m "Second commit" a.text
[master 4e85073] Second commit
 1 file changed, 2 deletions(-)
cooldeMacBook-Pro:git-learn cool$ 

================================================
 1 file changed, 2 deletions(-)   代表 两行 删除了

 

其实前面已经提到过的,修改好的a.text 可以直接提交 git commit -m "Second commit" a.text 不需要先添加到暂存区。

git概述-入门常识

一、版本控制工具应该具备的功能

协同修改
多人并行不悖的修改服务器端的同一个文件。

数据备份
不仅保存 目录和文 件的当前 状态,还 能够保存 每一个提 交过的历 史状态。 版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据 ,以节约存储空间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而Git采取了文 件系统快照的方式 。

权限控制
对团队中 参与开发 的人员进 行权限控 制。
对团队外 开发者贡 献的代码 进行审核 ——Git 独有。

历史 记录
查看修改 人、修改 时间、修 改内容、 日志信息 。
将本地文 件恢复到 某一个历 史状态。

分支 管理
允许开发 团队在工 作过程中 多条生产 线同时推 进任务, 进一步提 高效率。

二、版本控制简介

2.1 版本控制
工程设计领域中使用版本控制管理工程蓝图的设计过程。在IT开发过程中也可以使用版本控制思想管理代码的版本迭 代。

2.2 版本控制工具
思想:版本控制
实现 :版本控制工具

2.3 集中式版本控制工具:
CVS 、SVN、VSS ……

2.4 分布式版本控制工具:
Git、Mercurial 、Bazaar、Darcs……

三、git简史

控制台输入 git help [具体命令] ,可以查看相关帮助文档。

四、git优势

1、大部分操作在本地完成,不需要联网
2、完整性保证
3、尽可能添加数据而不是删除或修改数据分支操作非常快捷流畅
4、与Linux命令全面兼容

五、git使用流程

redis订阅

一、订阅含义

进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

订阅/发布消息图:

三、订阅举例

先订阅后发布 后才能收到消息,
1 可以一次性订阅多个,SUBSCRIBE c1 c2 c3

2 消息发布,PUBLISH c2 hello-redis
=========================================================
3 订阅多个,通配符*, PSUBSCRIBE new*
4 收取消息, PUBLISH new1 redis2015

redis事务-概述

一、事务含义

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。一个队列中,一次性、顺序性、排他性的执行一系列命令。
redis 支持 有限的事务。

二、基本操作流程

1、开启:以MULTI开始一个事务
2、入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
3、执行:由EXEC命令触发事务

(1)如果输入到队列的操作,发现又一个错误,则全体操作都不执行。
(2)如果输入到队列的操作,在执行前没有发现错误,执行时才发现错误。那么错误命令不执行,正确的命令会执行。
(3)如果中途输入 discard 放弃执行事务,则不会执行。

三、watch监控

对某个对象watch添加了CAS(Check And Set),相当于添加了乐观锁。

1、悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

2、 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改, 所以不会上锁 ,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,乐观锁策略:提交版本必须大于记录当前版本才能执行更新

初始化信用卡可用余额和欠额
无加塞篡改,先监控再开启multi, 保证两笔金额变动在同一个事务内
有加塞篡改
  监控了key,如果key被修改了,后面一个事务的执行失效
 unwatch
一旦执行了exec之前加的监控锁都会被取消掉了
小结
  Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变, 比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行
  通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化, EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败

四、redis事务特性

1、没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到这个让人万分头痛的问题

2、不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。【所谓的支持有限的事务】

redis持久化-主从复制和读写分离

一、含义

主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。

二、操作方法

I、配从(库)不配主(库)
从库配置:slaveof 主库IP 主库端口
(1)每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
(2)Info replication【查看从属信息】
II、单台主机,配置多个redis实例,需要修改配置文件细节操作
拷贝多个redis.conf文件
开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字

三、常见用法

(1)一主二仆
一个Master两个Slave
(2)薪火相传
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力
中途变更转向:会清除之前的数据,重新建立拷贝最新的
Slaveof 新主库IP 新主库端口
(3)反客为主
SLAVEOF no one
使当前数据库停止与其他数据库的同步,转成主数据库

四、哨兵模式-自动化主从复制

1、是什么
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
2、怎么玩(使用步骤)
(1)调整结构,6379端口实例 带着6380、6381
SLAVEOF    IP   端口
(2)配置哨兵,填写内容:
自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错。

sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机

(3)启动哨兵
Redis-sentinel /myredis/sentinel.conf
上述目录依照各自的实际情况配置,可能目录不同
3、正常主从演示
原有的master挂了
投票新选
重新主从继续开工,info replication查查看
问题:如果之前的master重启回来,会不会双master冲突?【不会之前的master会变成slave】

五、复制原理

Slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

六、复制的缺点

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

redis持久化-RDB和AOF

aof和rdb可以共存,首先加载aof,如果aof文件损坏,redis启动报错。
RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?
作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),
快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

一、RDB

1、RDB含义

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

2、fork方法

Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

3、触发rdb方法

(1)配置文件中默认的快照配置。
save 900 1
save 300 10
save 60 10000
(2)命令save或者是bgsave
Save:save时只管保存,其它不管,全部阻塞。
BGSAVE:Redis会在后台异步进行快照操作,
快照同时还可以响应客户端请求。可以通过lastsave
命令获取最后一次成功执行快照的时间。
(3)执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义。

3、恢复信息方法

(1)将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。
(2)CONFIG GET dir获取目录。

4、优势和劣势

优势
适合大规模的数据恢复。
对数据完整性和一致性要求不高。
劣势
在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。

5、禁用rdb

动态所有停止RDB保存规则的方法:redis-cli config set save “”

二、AOF

1、AOF的含义

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),
只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis
重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

2、启用AOF

在配置文件中,修改默认的appendonly no,改为yes

3、Rewrite重写机制

(1)含义:
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof。
(2)原理:
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),
遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,
而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
(3)触发机制:
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。

4、恢复信息

正常恢复
将有数据的aof文件复制一份保存到对应目录(config get dir)
恢复:重启redis然后重新加载
异常恢复
备份被写坏的AOF文件
修复:
Redis-check-aof –fix进行修复
恢复:重启redis然后重新加载

5、优势和劣势

优势:
每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
不同步:appendfsync no 从不同步
劣势:
相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

三、性能比较

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。

如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。

如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构 。

 

 

redis配置文件-常见总结

参数说明
redis.conf 配置项说明如下:
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 绑定的主机地址
bind 127.0.0.1
5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
12. 指定本地数据库存放目录
dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof
14. 当master服务设置了密码保护时,slav服务连接master的密码
masterauth
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec

21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32
25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4
27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
activerehashing yes
30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf