如何在Linux中轻松修正拼写错误的Bash命令?

未分类

我知道你可以按下向上箭头来调出你运行过的命令,然后使用左/右键移动到拼写错误的单词,并更正拼写错误的单词,最后按回车键再次运行它,对吗?可是等等。还有一种更简单的方法可以纠正 GNU/Linux 中拼写错误的 Bash 命令。这个教程解释了如何做到这一点。请继续阅读。

在 Linux 中纠正拼写错误的 Bash 命令

你有没有运行过类似于下面的错误输入命令?

$ unme -r
bash: unme: command not found

你注意到了吗?上面的命令中有一个错误。我在 uname 命令缺少了字母 a。

我在很多时候犯过这种愚蠢的错误。在我知道这个技巧之前,我习惯按下向上箭头来调出命令,并转到命令中拼写错误的单词,纠正拼写错误,然后按回车键再次运行该命令。但相信我。下面的技巧非常易于纠正你刚刚运行的命令中的任何拼写错误。

要轻松更正上述拼写错误的命令,只需运行:

$ ^nm^nam^

这会将 uname 命令中将 nm 替换为 nam。很酷,是吗?它不仅纠正错别字,而且还能运行命令。查看下面的截图。

未分类

当你在命令中输入错字时使用这个技巧。请注意,它仅适用于 Bash shell。

额外提示:

你有没有想过在使用 cd 命令时如何自动纠正拼写错误?没有么?没关系!下面的技巧将解释如何做到这一点。

这个技巧只能纠正使用 cd 命令时的拼写错误。

比如说,你想使用命令切换到 Downloads 目录:

$ cd Donloads
bash: cd: Donloads: No such file or directory

哎呀!没有名称为 Donloads 的文件或目录。是的,正确的名称是 Downloads。上面的命令中缺少 w。
要解决此问题并在使用 cd 命令时自动更正错误,请编辑你的 .bashrc 文件:

$ vi ~/.bashrc

最后添加以下行。

[...]
shopt -s cdspell

输入 :wq 保存并退出文件。

最后,运行以下命令更新更改。

$ source ~/.bashrc

现在,如果在使用 cd 命令时路径中存在任何拼写错误,它将自动更正并进入正确的目录。

未分类

正如你在上面的命令中看到的那样,我故意输错(Donloads 而不是 Downloads),但 Bash 自动检测到正确的目录名并 cd 进入它。

Fish 和 Zsh shell 内置的此功能。所以,如果你使用的是它们,那么你不需要这个技巧。

然而,这个技巧有一些局限性。它只适用于使用正确的大小写。在上面的例子中,如果你输入的是 cd donloads 而不是 cd Donloads,它将无法识别正确的路径。另外,如果路径中缺少多个字母,它也不起作用。

Git远端仓库版本回退方法

今天恰好有将GitHub中仓库版本回退的需求,按照之前本地git回退版本后再次push的方法出错,经过研究后找到了解决方法。

  • 首先git pull保证本地分支与远端分支版本同步
  • 先找到要退回的commit id:
git reflog
  • 接着本地回退版本:
git reset --hard [commit id]
  • 强制推送到远端仓库
git push -f origin master

这里特别要注意的是,本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支。

有关远端公共分支回滚版本

请参考原文:http://blog.csdn.net/fuchaosz/article/details/52170105

Centos7搭建Git及安装使用

一、Centos7.2 下 Git的安装

1、查看是否安装了git

rpm -qa|grep git

未分类

若已经安装,需要先卸载。卸载命令如下:

rpm -e --nodeps git  或者  rpm -e git

未分类

2、安装Git

yum install git

未分类

输入y,并回车

未分类

再使用 rpm -qa|grep git 来查看是否已经安装好了Git。

未分类

3、创建Git仓库

mkdir six_git        // 创建文件夹
useradd six             //创建用户名并设置密码
passwd six            //(系统会提示输入密码和再次密码)
groupadd git        // 创建组
git init --bare        //进入所创建的文件夹,初始化一个仓库
chown -R six:git /var/www/six_git/        // 赋权限

未分类

二、windows7 下连接Git版本库

1、安装Git 和 TortoiseGit(小乌龟)

2、在本地创建文件夹

>在windows7中某个盘符下创建一个名为“six” 的文件夹,这个文件夹就是我们与远程仓库通讯的文件夹。

3、进入“six”文件夹,右击菜单设置本机用户名和email

为了直观分辨不同用户为版本开发的贡献,需要设定用户名和email
下面分别是中文版和英文版的 TortoiseGit

未分类

未分类

未分类

未分类

4、Clone版本库(克隆)

在要克隆版本库的文件夹中点击右键,点击“Git克隆”菜单,根据图中信息填写后,点击确定,输入当时创建“six”账户是设置的密码即可。

未分类

未分类

未分类

输入创建“six”用户时,设置的密码。
英文版本:

未分类

未分类

填写好后,点击“ok”按钮,并要求输入密码。

未分类

5、添加文件

在clone库的文件夹中添加一个测试文件,并在空白处点击邮右键,选择“TortoiseGit”-à “添加”

未分类

勾选未受版本控制的文件,也就是刚刚创建的测试文件,点击确定按钮。

未分类

添加完成后,弹出“加入完成”对话框,点击确定即可

未分类

再在该文件夹空白出点击右键,点击“Git提交(C)->”master”…”

未分类

在对话框中填写相关的说明信息并选择文件,点击提交即可。

未分类

6、更新版本库

更新版本库前应该改先从服务器上“拉取”一下,再把自己修改的内容“推送”到服务器上.

未分类

未分类

三、建立发布版本库

1、在centos中建立发布版本库,然后进入文件夹。

未分类

2、更新版本库,进入版本目录,执行“git pull”命令

未分类

3、 禁止shell登陆

出于安全考虑,git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。
找到类似下面的一行:

six:x:502:502::/home/six:/bin/bash
改为
six:x:502:502::/home/six:/usr/local/git/bin/git-shell
或者
six:x:502:502::/home/six:/usr/bin/git-shell
six:x:502:502::/home/six:/bin/false

git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

未分类

四、错误

未分类

在 windows文件夹 下 bash命令中输入:

git fetch --all
git reset --hard origin/master

Git的bash操作:

进入git bash,我这个windows下个git已经安装配置完成了,所以直接clone,192.168.153.129为我centos7的ip
git clone [email protected]:/srv/git/project.git
输入git的密码
进入project.git
cd project.git
创建一个测试文件
vim test.txt
随便写一些内容
查看状态
git status      看到有一个待添加的文件texs.txt了
添加test.txt让git追踪
git add test.txt
提交到版本库,并写上备注信息
git commit test.txt -m ‘just a test’
把他推送到服务器的版本库中去
git push origin master

未分类

git client

未分类

git commit

已经推送到服务器端区了。。。接下来去服务器端看看有木有

刚才俺们在服务器端创建版本库时用的是 git init –bare project.git 加了个–bare就是创建一个裸仓库,没有工作区哒,所以这里只记录了文件的改动,要看是不是同步过来了,需要在git clone一次,看是不是这一次有test.txt啦

未分类

未分类

git clone [email protected]:/srv/git/project.git,输入密码后,开始下载代码了,果然master分支已经有test.txt啦.
git log查看一下提交记录,在mon feb 2 09:47:46 2015 +0800的这个,邮件为xxx的作者xxx提交哒。因为windows客户端配置的git是偶滴工作邮件和姓名,就打码了,ok,私有git搭建完成。

git的删除操作

rm test.txt
git status
$ git rm test.txt
rm 'test.txt'
git add -u
$ git commit -m "remove test.txt"
git push

现在,文件就从版本库中被删除了。

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

小结

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

Jenkins执行git命令报错:Host key verification failed.

在jenkins集成给it,执行git命令测试如下:

git ls-remote -h [email protected]:username/myproject.git HEAD

报错如下:

Failed to connect to repository : Command "git ls-remote -h [email protected]:cc/myproject.git HEAD" returned status code 128:
stdout:
stderr: Host key verification failed.
fatal: The remote end hung up unexpectedly

原因

这需要使用jenkins用户访问mygti.com的主机添加到

~/.ssh/known_hosts。

解决

切换为jenkins用户:

sudo su -s /bin/bash jenkins

在jenkins用户下执行刚才的git命令:

git ls-remote -h [email protected]:username/myproject.git HEAD

在终端提示如下:

The authenticity of host 'mygit.com (xxx.xxx.xxx.xx)' can't be established.
RSA key fingerprint is 84:8c:14:f2:6f:14:6d:6c:3b:fc:ac:49:a6:7c:7a:41.
Are you sure you want to continue connecting (yes/no)?

输入yes回车。这时,mygit.com就已经添加到~/.ssh/known_hosts。

git 出现 fatal: refusing to merge unrelated histories 错误

引用

git pull 失败 ,提示:fatal: refusing to merge unrelated histories

其实这个问题是因为 两个 根本不相干的 git 库, 一个是本地库, 一个是远端库, 然后本地要去推送到远端, 远端觉得这个本地库跟自己不相干, 所以告知无法合并

具体的方法, 一个种方法: 是 从远端库拉下来代码 , 本地要加入的代码放到远端库下载到本地的库, 然后提交上去 , 因为这样的话, 你基于的库就是远端的库, 这是一次update了

第二种方法:
使用这个强制的方法

git pull origin master --allow-unrelated-histories

后面加上 --allow-unrelated-histories , 把两段不相干的 分支进行强行合并

后面再push就可以了 git push gitlab master:init

gitlab是别名 , 使用

Java代码
git remote add gitlab ssh://[email protected]:50022/opt/gitrepo/withholdings/WithholdingTransaction

master是本地的branch名字
init是远端要推送的branch名字

本地必须要先add ,commit完了 才能推上去

关于这个问题,可以参考http://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories。

在进行git pull 时,添加一个可选项

git pull origin master --allow-unrelated-histories

git切换分支提示失败(The following untracked working tree files would be overwritten by checkout)

git切换分支的时候报:The following untracked working tree files would be overwritten by checkout

解决方法:

1、

git rm –cached

2、

git clean -d -fx “”

-x means ignored files are also removed as well as files unknown to git.

-d means remove untracked directories in addition to untracked files.

-f is required to force it to run.

Git hook(钩子文件)机制

githooks(5)

NAME

githooks – Hooks(钩子) used by git

SYNOPSIS

$GIT_DIR/hooks/*

简介

Hooks(钩子),是一些存放于$GIT_DIR/hooks文件夹的小脚本,在特定条件下触发动作.
当执行’git init’,几个示例hook将复制到新资源库的hooks文件夹, 但默认情况下他们都是禁用状态.
要启用一个hook(钩子),请移除其.sample后缀.

注意: 你还需要为这些hook(钩子)添加可执行权限(译者注: 仅针对非Windows系统, chmod u+x XXX).
然而,在新创建的资源库中, – 那些.sample默认已经是可执行的(译者注: 并非如此!!).

本文档描述的是当前已经等于的hooks(钩子).

HOOKS(钩子)

applypatch-msg

这个hook由'git am'脚本触发. 它将接受一个参数,即将提交的commit msg的临时文件路径.
如果这个hook以非0状态退出,那么'git am'将在patch(补丁)应用之前取消.

这个hook可以用于修改message(信息)文件, 用来匹配项目的规范格式(如果有的话). 
也可以用于校验commit msg,并在必要时拒绝提交.

缺省的'applypatch-msg' hook, 当其启用时,将调用'commit-msg' hook.

pre-applypatch

这个hook由'git am'脚本触发.  它并不接受参数, 当patch(补丁信息)已经应用,且commit尚未执行
之前被调用.

如果以非0状态退出, 那么working tree(工作树)将不会被提交,但patch已经被应用.

它可以用于检查当前的working tree(工作树),当其无法通过某个特定测试时,拒绝进行提交.

缺省的'pre-applypatch' hook, 当其启用时,将调用'pre-commit' hook.

post-applypatch

这个hook由'git am'脚本触发.  它并不接受参数, 在patch已经应用且commit已经完成后执行.

这个hook主要用于通知, 而且对'git am'的输出无影响.

pre-commit

这个hook由'git commit'触发, 且可以通过`--no-verify` 来略过.  它并不接受参数, 在commit msg被创建之前执行.  
如果以非0状态退出,将导致'git commit'被取消.

缺省的'pre-commit' hook, 当启用时, 将捕捉以空白字符结尾的行,如果找到这样的行,则取消提交.
(译者注: 事实上并非如此,而是查找非ascii文件名!!)

所有的'git commit' hooks在执行时,如果没有指定编辑器,那么都附带一个环境变量`GIT_EDITOR=:`

prepare-commit-msg

这个hook由'git commit',在准备好默认log信息后触发,但此时,编辑器尚未启动.

它可能接受1到3个参数.
第一个参数是包含commit msg的文件路径.
第二个参数是commit msg的来源, 可能的值有: 
  `message` (当使用`-m` 或`-F` 选项);
  `template` (当使用`-t` 选项,或`commit.template`配置项已经被设置);
  `merge` (当commit是一个merge或者`.git/MERGE_MSG`存在); 
  `squash`(当`.git/SQUASH_MSG`文件存在);
  `commit`, 且附带该commit的SHA1 (当使用`-c`, `-C` 或 `--amend`).

如果以非0状态退出, 'git commit' 将会被取消.

这个hook的目的是修改message文件,且不受`--no-verify`的影响.  
本hook以非0状态退出,则代表当前hook失败,并取消提交.它不应该取代`pre-commit` hook.

示例`prepare-commit-msg` hook是准备一个merge的冲突列表.

commit-msg

这个hook由'git commit'触发, 且可以通过`--no-verify` 来略过.
它接受一个参数, 包含commit msg的文件的路径.

如果以非0状态退出, 'git commit' 将会被取消.

这个hook可以用于修改message(信息)文件, 用来匹配项目的规范格式(如果有的话). 
也可以用于校验commit msg,并在必要时拒绝提交.

缺省的'commit-msg' hook, 当启用时,将检查重复的"Signed-off-by"行, 如果找到,则取消commit.

post-commit

这个hook由'git commit'触发.  它不接受参数, 当commit完成后执行.
这个钩子主要用于通知,对'git commit'的输出无影响.

pre-rebase

这个hook由'git rebase'触发,可以用于避免一个分支被rebase.

(译者注: 原文未提及这个hook的参数数量及作用,下面的说明是我自己加的)
第一个参数, the upstream the series was forked from.
第二个参数(可选), the branch being rebased (or empty when rebasing the current branch).

如果以非0状态退出,则取消'git rebase'

post-checkout

这个hook由'git checkout'触发, 此时,worktree已经被更新.
这个hook接受3个参数: 之前HEAD的ref,新HEAD的ref,一个标记(1-改变分支,0-恢复文件)
这个hook不会影响'git checkout'的输出.

它也可以被'git clone'触发, 仅当没有使用'--no-checkout (-n)'. 
第一个参数是null-ref,第二个参数新的HEAD的ref,第三个参数(flag)永远为1.

这个hook可以用于进行校验检查, 自动显示前后差异, 或者设置工作目录的meta属性.

post-merge

这个hook由'git merge'触发,当'git pull'在本地资源库执行完毕.
这个钩子接受一个参数, 一个状态标记(当前merge顺利squash -- 不知道啥意思~_~).
如果合并失败(冲突),那么这个hook不会影响'git merge'的输出,且不会被执行.

这个hook用于与pre-commit hook共同使用,以保存并恢复working tree的metadata.
(例如: permissions(权限)/ownership(所有者), ACLS(访问控制), etc).
请查看源码中的contrib/hooks/setgitperms.perl,演示了如何使用这个功能.

pre-receive

这个hook由远程资源库的'git-receive-pack'触发,此时,'git push'已经在本地资源库执行完毕.
此时,正准备update远程资源库的refs,且pre-receive hook已经被触发并执行完毕.
它的退出状态,决定了全部ref的update是否可以进行.

这个hook,每个接收操作,仅执行一次. 它不接受参数,但可以从标准输入读取以下格式的文本(每个ref一行):

  <old-value> SP <new-value> SP <ref-name> LF

这里的 `<old-value>` 是ref中原本的Object名,
`<new-value>` 是ref中老的Object名 and
`<ref-name>` 是ref的全名.
当创建一个新ref,`<old-value>` 将是 40, 即字符`0`.
(译者注: SP=空格, LF=n)

如果这个hook以非0状态退出,则所有ref都不会被更新(update). 
如果以0退出, 仍可以通过<<update,'update'>> hook 来拒绝特定的ref的更新.

hook的标准输入/标准输出,均导向'git send-pack',所以,你可以简单地使用`echo`来为用户打印信息.
(译者注: 就是本地push后打印出来的信息)

update

这个hook由远程资源库的'git-receive-pack'触发,此时,'git push'已经在本地资源库执行完毕.
此时,正准备update远程资源库的ref.
它的退出状态,决定了当前ref的update是否可以进行.

每个将要update的ref,都会触发一次这个hook, 它接受3个参数:

 - 将要被update的ref的名字,
 - ref中老object的名字,
 - 将要存储的ref的新名字.

以0状态退出,将允许当前ref被update.
以非0状态退出,将防止'git-receive-pack'更新当前ref.

这个hook可以用于防止特定的ref被'force'更新..
就是说,可以确保"fast-forward only"这一安全准则.

它也可以用于记录新旧状态.  然而, 它并不知道整体的分支状态,所以它可能被天真地用于为每个ref发送email.
<<post-receive,'post-receive'>> hook更适合做这个需求哦.

另外一个用法是使用这个hook实现访问控制, 而不仅仅通过文件系统的权限控制.

hook的标准输入/标准输出,均导向'git send-pack',所以,你可以简单地使用`echo`来为用户打印信息.
(译者注: 就是本地push后打印出来的信息)

缺省的'update' hook, 当启用,且`hooks.allowunannotated`配置项未设置或设置为false时,防止未声明的tag被更新.

post-receive

这个hook由远程资源库的'git-receive-pack'触发,此时,本地资源库的'git push'已经完成,且所有ref已经更新.

这个hook仅执行一次.  它不接受参数,但跟<<pre-receive,'pre-receive'>> hook获取相同的标准输入格式.

这个hook并不影响'git-receive-pack'的输出,因为它在实际工作完成之后执行.

跟<<post-update,'post-update'>> hook不一样的是,这个hook可以拿到ref在update前后的值.

hook的标准输入/标准输出,均导向'git send-pack',所以,你可以简单地使用`echo`来为用户打印信息.
(译者注: 就是本地push后打印出来的信息)

缺省的'post-receive' hook 是空白的, 但提供了一个示例脚本`post-receive-email`,位于源码中的`contrib/hooks`
目录,实现了发送commite mails的功能.

post-update

这个hook由远程资源库的'git-receive-pack'触发,此时,本地资源库的'git push'已经完成,且所有ref已经更新.

它接受可变数量的参数, 每一个参数都是已经实际update的ref的名字.

这个hook主要是为了统治, 无法影响'git-receive-pack'的输出.

'post-update' hook可以知道哪些ref已经被push,但无法知道原本及更新后的值,
所以它不是一个好地方去处理新旧变化.
<<post-receive,'post-receive'>> hook 可以拿到新旧两个值. 你可以考虑使用它们.

默认的'post-update' hook,启用后,将允许'git update-server-info'来更新无状态传输(例如http)的信息.
如果你通过HTTP协议来公开git资源库,那么你很可能需要启用这个hook.

hook的标准输入/标准输出,均导向'git send-pack',所以,你可以简单地使用`echo`来为用户打印信息.
(译者注: 就是本地push后打印出来的信息)

pre-auto-gc

这个hook由'git gc --auto'触发. 它不接受参数, 非0状态退出,将导致'git gc --auto'被取消.

(译者注: 有一个示例contrib/hooks/pre-auto-gc-battery,演示了在电池状态(笔记本电脑没插电源)时,拒绝执行git gc的功能)

post-rewrite

这个hook由改写commit的命令所触发(`git commit
--amend`, 'git-rebase'; 当前 'git-filter-branch' 并'不'触发它!!).
它的第一个参数,表示当前是什么命令所触发:`amend` 或 `rebase`.  
也许将来会传递更多特定于命令的参数.

这个hook通过标准输入接收rewritten commit的列表,格式如下:

  <old-sha1> SP <new-sha1> [ SP <extra-info> ] LF

其中'extra-info'是命令本身所决定的,如果为空,那么前置的SP(空格)也不存在.
当前没有任何命令会使用'extra-info'.

这个hook总是在自动note copying之后只需(请参看 "notes.rewrite.<command>" in linkgit:git-config.txt).

以下是特定命令的附加注释:

rebase::
    'squash' and 'fixup'操作, 所有提交(squashed)将重写进squashed commit.
    这意味着多行squash将使用同一个new-sha1'.

+ 在列表中的commits的顺序,严格符合与传递给rebase的顺序.

译者后记:

1、hook列表:

------------------------------------------------------
|钩子名字          |触发命令    |参数|非0导致取消|备注|
|applypatch-msg    |git am      |1   |Yes||
|pre-applypatch    |git am      |0   |Yes||
|post-applypatch   |git am      |0   |No ||

|pre-commit        |git commit  |0   |Yes||
|prepare-commit-msg|git commit  |1~3 |Yes||
|commit-msg        |git commit  |1   |Yes||
|post-commit       |git commit  |0   |No ||

|pre-rebase        |git rebase  |2   |Yes||

|post-checkout     |git checkout|3   |No ||

|post-merge        |git merge   |1   |No ||

|pre-receive       |git-receive-pack |0   |Yes|通过标准输入获取信息|
|update            |git-receive-pack |3   |Yes||
|post-receive      |git-receive-pack |0   |No |通过标准输入获取信息|
|post-update       |git-receive-pack |可变|No ||
------------------------------------------------------

2、hook的示例

虽然示例中,hook都是perl脚本,但绝对不表示只能用perl.只要是可执行的东西,都可以作为钩子

3、源码级别的hook信息

我非常神奇地发现, hook的名字,并没有独立写在某个h文件中,而是分布于几个具体的c文件中
主执行入口: run_hook(const char index_file, const char name, …) 定义于run-command.h,实现于run-command.c

官方说明:

`run_hook`::

    Run a hook.(执行一个hook)
    The first argument is a pathname to an index file, or NULL(第一个参数是index file,可能为NULL)
    if the hook uses the default index file or no index is needed.
    The second argument is the name of the hook.(第二个参数是hook的名字)
    The further arguments correspond to the hook arguments.(剩下的,就是hook自己需要的参数了)
    The last argument has to be NULL to terminate the arguments list.(最后一个参数必须是NULL,C的常识性用法)
    If the hook does not exist or is not executable, the return
    value will be zero.(当hook不存在或不可执行,则返回0 )
    If it is executable, the hook will be executed and the exit
    status of the hook is returned. (方法的返回值,就是hook的退出状态)
    On execution, .stdout_to_stderr and .no_stdin will be set.
    (See below.)

GIT

Part of the linkgit:git[1] suite

git与github远程连接代码库使用笔记

一、安装与账号添加

1. git安装

目前windows版本的git有几种实现,但我们选择msysgit发行版,这是目前做得兼容性最好的。下载地址:http://code.google.com/p/msysgit/downloads/list

2. 生成SSH密钥

ssh-keygen -C '[email protected]' -t rsa

相关内容会存放在:C:Usersuser.ssh之中,有id_rsa,id_rsa.pub

3. 在github中验证

来到自己的github账户:
点击右上角的Edit your profile—> Account Settings—>SSH Public keys —> new ssh key
然后输入id_rsa.pub之中:

未分类

在git bash中执行以下命令完成:

ssh -T [email protected]

4. git本地构建github库

先在自己的github中创建一个Repository,然后在本地git中加入自己的信息:

git config --global user.name "maz"
git config --global user.email "[email protected]"

.

二、git的使用

譬如你的项目为:m/project

1. 添加文件

$ mkdir ~/project //创建一个项目hello-world
$ cd ~/project //打开这个项目
$ git init    //初始化 
$ touch README
$ git add README   //更新README文件
$ git commit -m 'first commit' //提交更新,并注释信息“first commit” !!! 修改code的关键
$ git remote add origin [email protected]:mattzheng/tensorflow.git //连接远程github项目  
$ git push -u origin master   //将本地项目更新到github项目上去 ,更新+修改

add README 是把文件上传到一个临时空间中,然后git commit才确认更新。
确认更新之后,需要git push 才能更新github上的内容。
其中:master 是原始的分支,可以直接创建,origin 是别名
其中:git commit -m ‘first commit’ 更新并注释

2. 分支的使用

创建分支

最开始只有一条分支:master

# 第一种方法:
git checkout -b dev 创建一个新的分支:dev + 并来到新的分支  
# 第二种方法:
git branch dev  # 创建
git checkout dev #来到dev分支
git checkout master # 来自master分支

查看分支

# 查看分支
git branch
git add readme.txt
git commit -m "注释:提交到dev分支"
git push -u origin dev

合并分支

要现在原来的分支中提交:

git push -u origin dev

然后再回到主分支master,然后merge起来:

git merge dev

删除分支

git branch -d dev

3. 回滚与状态查询

git status  # 已加载(staged)和未加载(unstaged)文件的状态、提交等,你可以询问git的状态

4. 取得远程代码库的一份本地拷贝

如果你还没有一份远程代码库的本地版本(例如,如果你在另一台机器上开始工作,这台机器上还没有用过这个项目),你首先需要拷贝(clone)它。去到你的代码库想要拷贝到的文件夹下,并发送:

git clone https://[email protected]/your_username/name_of_remote_repository.git

5. git删除文件

参考:https://www.jianshu.com/p/c3ff8f0da85e

删除本地文件,但是未添加到暂存区;
删除本地文件,并且把删除操作添加到了暂存区;
把暂存区的操作提交到了本地git库;
把本地git库的删除记录推送到了远程服务器github。

删除缓存区一个文件:

git rm test.txt

删除缓存区一个文件夹:

git rm test -r -f

同步删除操作到远程分支:

git commit -m "delete raindow"  

延伸一:git push origin master 报错:

$ git push origin master
To github.com:xiaoyangLee/LearnJava.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to '[email protected]:xiaoyangLee/LearnJava.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

原因是远程仓库中的文件和我们本地的仓库有差异,例如你的远程仓库有个文件Readme.md,但是本地仓库却没有,就可能会出现这种情况。

之所以出现这种情况,原因多种多样,例如你直接使用了github上传文件,或者像我一样,这次使用了另外一个系统推送了文件,导致了此问题的出现。解决办法显然有,把本地仓库删了再git clone一个,但是这种方法显然不可取….

解决办法:使用git pull 合并分支

git pull --rebase origin master

zabbix 监控tcp连接的状态

Tcp的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB;或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是是time_wait值比较高的话,我们要考虑看我们内核是否需要调优,太高的time_wait值的话会占用太多端口,要是端口少的话后果不堪设想:

一、我的上一篇已经写了步骤,这里我只是列出脚本:

#!/bin/bash
#xiaoluo
#scripts for tcp status
function SYNRECV {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'SYN-RECV' | awk '{print $2}'
}
function ESTAB {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}'
}
function FINWAIT1 {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'FIN-WAIT-1' | awk '{print $2}'
}
function FINWAIT2 {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'FIN-WAIT-2' | awk '{print $2}'
}
function TIMEWAIT {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}'
}
function LASTACK {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LAST-ACK' | awk '{print $2}'
}
function LISTEN {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}'
}
$1

二、填写key值:当然大家在加入key值之后最好再服务器上面去执行看有没有返回值:

[root@WEB_007 scripts]# cat /usr/local/zabbix/etc/zabbix_agentd.conf.d/tcp 
#monitor tcp
UserParameter=tcp[*],/usr/local/zabbix/scripts/tcp_status $1

三、导入模板(在我的附件上,然后触发器根据自己的情况调整:)

四、查看效果:

未分类

到此结束:

在写这篇的时候刚好也写完了监控lvs的活动连接。下面也给出模板、大家自己下载,我这里给出脚本和key:

一、脚本:

#!/bin/bash
#xiaoluo
#status about lvs forward
function first {
/sbin/ipvsadm -L 2>/dev/null | grep '192.168.10.234:http' | sed '2d' | awk '{print $5}'
}
function second {
/sbin/ipvsadm -L 2>/dev/null | grep '192.168.10.235:http' | sed '2d' | awk '{print $5}'
}
function third {
/sbin/ipvsadm -L 2>/dev/null | grep '192.168.10.236:http' | sed '2d' | awk '{print $5}'
}
$1

二、key:

#monitor lvs
UserParameter=lvs[*],/usr/local/zabbix/scripts/ipvsadm_status $1

效果展示:

未分类

模板在下面自己下载:

http://down.51cto.com/data/2365654

Zabbix实现微信报警

zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。

zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。

下文讲述了如何通过微信实现zabbix的告警:

第一步、注册微信公众号

首先申请微信公众平台https://mp.weixin.qq.com/一个人最多申请5个公众号,所以还是可以的,申请完之后就可以根据腾讯的提示使用微信公众号了,然后用你自己的微信扫描关注微信号。

未分类

就可以看到用户数了,接下来的就要使用的用户的微信ID号了。点击用户查看用户的微信ID号。在浏览器查看用户的微信ID号。

点击总用户数,点击刚刚关注的你自己的微信号的头像,在弹出的网页url中有你微信号的id 也就是下面url标红的部分。

https://mp.weixin.qq.com/cgi-bin/singlesendpage?t=message/send&action=index&tofakeid=1415366540&token=1136922890&lang=zh_CN

未分类

第二步、下载并配置微信公众平台私有接口

下载API

# git clone https://github.com/lealife/WeiXin-Private-API

修改config文件:

# vi config.php
==============================================
<?php
// 全局配置
$G_ROOT = dirname(__FILE__);
$G_CONFIG["weiXin"] = array(
'account' => '微信公众登录号码',
'password' => '微信公众登录密码',
'cookiePath' => $G_ROOT. '/cache/cookie', // cookie缓存文件路径
'webTokenPath' => $G_ROOT. '/cache/webToken', // webToken缓存文件路径
);
==============================================
修改test.php文件
==============================================
<?php
require "config.php";
require "include/WeiXin.php";
$weiXin = new WeiXin($G_CONFIG['weiXin']);
$testFakeId = "$argv[1]";
$msg="$argv[3]";
print_r($weiXin->send($testFakeId, "$msg"));
===============================================

注意这里$msg=”$argv[3]”表示zabbix传入的第三个参数,因为在zabbix报警时会传入三个参数:一是微信好友ID,二是报警信息的主题,三是报警信息的具体内容,这里跳过了报警信息主题,直接发送报警信息内容

创建微信报警脚本weixin.sh 放到zabbix默认的脚本路径里,我的zabbix脚本路径为: /app/zabbix/share/zabbix/alertscripts

# touch /app/zabbix/share/zabbix/alertscripts/weixin.sh
===================================================
#!/bin/bash 
php test.php "$1" "$2" "$3"
===================================================
#  chmod +x weixin.sh      给脚本增加执行权限
#  chown zabbix:zabbix weixin.sh      给zabbix用户赋予权限

测试接口是否可以使用:

#  ./weixin.sh 1415366540 "" "Welcome Weixin"

若出现以下信息,则表示发送成功:

未分类

第三步、配置Zabbix告警

1、增加示警媒介类型:

未分类

2、添加用户报警媒介,这里使用administrator用户

未分类

3、添加报警动作

未分类

告警内容在本文章最下面会有文字版

未分类

测试:
停掉一台线上测试服务器的nginx,看是否收到微信的告警:如图

未分类

使用Zabbix进行微信告警配置完毕!

下面是zabbix告警模板

主 题:
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
默认信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

恢复主指:
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME}: {TRIGGER.NAME}已恢复!
恢复信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}