jQuery入门

jQuery 是一个 JavaScript 库。jQuery 很容易学习。最近用到了jQuery和Bootstrap,于是记录一下。这一篇是jQuery的一个很粗略的列表总结。

jQuery选择器

$(this)			当前 HTML 元素
$("p")			所有 <p> 元素
$("p.intro")	所有 class="intro" 的 <p> 元素
$(".intro")		所有 class="intro" 的元素
$("#intro")		id="intro" 的元素
$("ul li:first")		每个 <ul> 的第一个 <li> 元素
$("[href$='.jpg']")		所有带有以 ".jpg" 结尾的属性值的 href 属性
$("div#intro .head")	id="intro" 的 <div> 元素中的所有 class="head" 的元素

:first	$("p:first")	第一个 <p> 元素
:last	$("p:last")		最后一个 <p> 元素
:even	$("tr:even")	所有偶数 <tr> 元素
:odd	$("tr:odd")		所有奇数 <tr> 元素
 	 	 
:eq(index)	$("ul li:eq(3)")	列表中的第四个元素(index 从 0 开始)
:gt(no)	$("ul li:gt(3)")		列出 index 大于 3 的元素
:lt(no)	$("ul li:lt(3)")		列出 index 小于 3 的元素
:not(selector)	$("input:not(:empty)")	所有不为空的 input 元素
 	 	 
:header	$(":header")	所有标题元素 <h1> - <h6>
:animated	 			所有动画元素

jQuery事件

触发实例:

$(“button#demo”).click()

常用事件

bind()	向匹配元素附加一个或更多事件处理器
click()	触发、或将函数绑定到指定元素的 click 事件
focus()	触发、或将函数绑定到指定元素的 focus 事件
scroll()	触发、或将函数绑定到指定元素的 scroll 事件
toggle()	绑定两个或多个事件处理器函数,当发生轮流的 click 事件时执行。
trigger()	所有匹配元素的指定事件
load()	触发、或将函数绑定到指定元素的 load 事件

全部事件

方法	描述
blur()	触发、或将函数绑定到指定元素的 blur 事件
change()	触发、或将函数绑定到指定元素的 change 事件
dblclick()	触发、或将函数绑定到指定元素的 double click 事件
delegate()	向匹配元素的当前或未来的子元素附加一个或多个事件处理器
die()	移除所有通过 live() 函数添加的事件处理程序。
error()	触发、或将函数绑定到指定元素的 error 事件
event.isDefaultPrevented()	返回 event 对象上是否调用了 event.preventDefault()。
event.pageX	相对于文档左边缘的鼠标位置。
event.pageY	相对于文档上边缘的鼠标位置。
event.preventDefault()	阻止事件的默认动作。
event.result	包含由被指定事件触发的事件处理器返回的最后一个值。
event.target	触发该事件的 DOM 元素。
event.timeStamp	该属性返回从 1970 年 1 月 1 日到事件发生时的毫秒数。
event.type	描述事件的类型。
event.which	指示按了哪个键或按钮。
keydown()	触发、或将函数绑定到指定元素的 key down 事件
keypress()	触发、或将函数绑定到指定元素的 key press 事件
keyup()	触发、或将函数绑定到指定元素的 key up 事件
live()	为当前或未来的匹配元素添加一个或多个事件处理器
mousedown()	触发、或将函数绑定到指定元素的 mouse down 事件
mouseenter()	触发、或将函数绑定到指定元素的 mouse enter 事件
mouseleave()	触发、或将函数绑定到指定元素的 mouse leave 事件
mousemove()	触发、或将函数绑定到指定元素的 mouse move 事件
mouseout()	触发、或将函数绑定到指定元素的 mouse out 事件
mouseover()	触发、或将函数绑定到指定元素的 mouse over 事件
mouseup()	触发、或将函数绑定到指定元素的 mouse up 事件
one()	向匹配元素添加事件处理器。每个元素只能触发一次该处理器。
ready()	文档就绪事件(当 HTML 文档就绪可用时)
resize()	触发、或将函数绑定到指定元素的 resize 事件
select()	触发、或将函数绑定到指定元素的 select 事件
submit()	触发、或将函数绑定到指定元素的 submit 事件
triggerHandler()	第一个被匹配元素的指定事件
unbind()	从匹配元素移除一个被添加的事件处理器
undelegate()	从匹配元素移除一个被添加的事件处理器,现在或将来
unload()	触发、或将函数绑定到指定元素的 unload 事件

jQuery效果

$(“p”).hide(1000,function(){ alert(“The paragraph is now hidden”); }); $(“#p1”).css(“color”,”red”).slideUp(2000).slideDown(2000);

animate()	对被选元素应用“自定义”的动画
clearQueue()	对被选元素移除所有排队的函数(仍未运行的)
delay()	对被选元素的所有排队函数(仍未运行)设置延迟
dequeue()	运行被选元素的下一个排队函数
fadeIn()	逐渐改变被选元素的不透明度,从隐藏到可见
fadeOut()	逐渐改变被选元素的不透明度,从可见到隐藏
fadeTo()	把被选元素逐渐改变至给定的不透明度
hide()	隐藏被选的元素
queue()	显示被选元素的排队函数
show()	显示被选的元素
slideDown()	通过调整高度来滑动显示被选元素
slideToggle()	对被选元素进行滑动隐藏和滑动显示的切换
slideUp()	通过调整高度来滑动隐藏被选元素
stop()	停止在被选元素上运行动画
toggle()	对被选元素进行隐藏和显示的切换

HTML操作

属性操作

addClass()	向匹配的元素添加指定的类名。
attr()	设置或返回匹配元素的属性和值。
hasClass()	检查匹配的元素是否拥有指定的类。
html()	设置或返回匹配的元素集合中的 HTML 内容。
removeAttr()	从所有匹配的元素中移除指定的属性。
removeClass()	从所有匹配的元素中删除全部或者指定的类。
toggleClass()	从匹配的元素中添加或删除一个类。
val()	设置或返回匹配元素的值。

$("button").click(function(){
  $("#w3s").attr("href", function(i,origValue){
    return origValue + "/jquery";
  });
});

css操作

css()	设置或返回匹配元素的样式属性。
height()	设置或返回匹配元素的高度。
offset()	返回第一个匹配元素相对于文档的位置。
offsetParent()	返回最近的定位祖先元素。
position()	返回第一个匹配元素相对于父元素的位置。
scrollLeft()	设置或返回匹配元素相对滚动条左侧的偏移。
scrollTop()	设置或返回匹配元素相对滚动条顶部的偏移。
width()	设置或返回匹配元素的宽度。

文档操作

addClass()	向匹配的元素添加指定的类名。
after()	在匹配的元素之后插入内容。
append()	向匹配元素集合中的每个元素结尾插入由参数指定的内容。
appendTo()	向目标结尾插入匹配元素集合中的每个元素。
attr()	设置或返回匹配元素的属性和值。
before()	在每个匹配的元素之前插入内容。
clone()	创建匹配元素集合的副本。
detach()	从 DOM 中移除匹配元素集合。
empty()	删除匹配的元素集合中所有的子节点。
hasClass()	检查匹配的元素是否拥有指定的类。
html()	设置或返回匹配的元素集合中的 HTML 内容。
insertAfter()	把匹配的元素插入到另一个指定的元素集合的后面。
insertBefore()	把匹配的元素插入到另一个指定的元素集合的前面。
prepend()	向匹配元素集合中的每个元素开头插入由参数指定的内容。
prependTo()	向目标开头插入匹配元素集合中的每个元素。
remove()	移除所有匹配的元素。
removeAttr()	从所有匹配的元素中移除指定的属性。
removeClass()	从所有匹配的元素中删除全部或者指定的类。
replaceAll()	用匹配的元素替换所有匹配到的元素。
replaceWith()	用新内容替换匹配的元素。
text()	设置或返回匹配元素的内容。
toggleClass()	从匹配的元素中添加或删除一个类。
unwrap()	移除并替换指定元素的父元素。
val()	设置或返回匹配元素的值。
wrap()	把匹配的元素用指定的内容或元素包裹起来。
wrapAll()	把所有匹配的元素用指定的内容或元素包裹起来。
wrapinner()	将每一个匹配的元素的子内容用指定的内容或元素包裹起来。

jQuery 尺寸

width()
height()
innerWidth()
innerHeight()
outerWidth()
outerHeight()

jQuery遍历

.each()	对 jQuery 对象进行迭代,为每个匹配元素执行函数。
.filter()	将匹配元素集合缩减为匹配选择器或匹配函数返回值的新元素。

.add()	将元素添加到匹配元素的集合中。
.andSelf()	把堆栈中之前的元素集添加到当前集合中。
.children()	获得匹配元素集合中每个元素的所有子元素。
.closest()	从元素本身开始,逐级向上级元素匹配,并返回最先匹配的祖先元素。
.contents()	获得匹配元素集合中每个元素的子元素,包括文本和注释节点。

.end()	结束当前链中最近的一次筛选操作,并将匹配元素集合返回到前一次的状态。
.eq()	将匹配元素集合缩减为位于指定索引的新元素。
.find()	获得当前匹配元素集合中每个元素的后代,由选择器进行筛选。
.first()	将匹配元素集合缩减为集合中的第一个元素。
.has()	将匹配元素集合缩减为包含特定元素的后代的集合。
.is()	根据选择器检查当前匹配元素集合,如果存在至少一个匹配元素,则返回 true。
.last()	将匹配元素集合缩减为集合中的最后一个元素。
.map()	把当前匹配集合中的每个元素传递给函数,产生包含返回值的新 jQuery 对象。
.next()	获得匹配元素集合中每个元素紧邻的同辈元素。
.nextAll()	获得匹配元素集合中每个元素之后的所有同辈元素,由选择器进行筛选(可选)。
.nextUntil()	获得每个元素之后所有的同辈元素,直到遇到匹配选择器的元素为止。
.not()	从匹配元素集合中删除元素。
.offsetParent()	获得用于定位的第一个父元素。
.parent()	获得当前匹配元素集合中每个元素的父元素,由选择器筛选(可选)。
.parents()	获得当前匹配元素集合中每个元素的祖先元素,由选择器筛选(可选)。
.parentsUntil()	获得当前匹配元素集合中每个元素的祖先元素,直到遇到匹配选择器的元素为止。
.prev()	获得匹配元素集合中每个元素紧邻的前一个同辈元素,由选择器筛选(可选)。
.prevAll()	获得匹配元素集合中每个元素之前的所有同辈元素,由选择器进行筛选(可选)。
.prevUntil()	获得每个元素之前所有的同辈元素,直到遇到匹配选择器的元素为止。
.siblings()	获得匹配元素集合中所有元素的同辈元素,由选择器筛选(可选)。
.slice()	将匹配元素集合缩减为指定范围的子集。

jQuery Ajax

$(selector).load(URL,data,callback);

$("#div1").load("demo_test.txt #p1");

$.get(URL,callback);

$("button").click(function(){
  $.get("demo_test.asp",function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

$.post(URL,data,callback);

$("button").click(function(){
  $.post("demo_test_post.asp",
  {
    name:"Donald Duck",
    city:"Duckburg"
  },
  function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

jQuery Ajax 库

jQuery.ajax()	执行异步 HTTP (Ajax) 请求。
.ajaxComplete()	当 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxError()	当 Ajax 请求完成且出现错误时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxSend()	在 Ajax 请求发送之前显示一条消息。
jQuery.ajaxSetup()	设置将来的 Ajax 请求的默认值。
.ajaxStart()	当首个 Ajax 请求完成开始时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxStop()	当所有 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxSuccess()	当 Ajax 请求成功完成时显示一条消息。
jQuery.get()	使用 HTTP GET 请求从服务器加载数据。
jQuery.getJSON()	使用 HTTP GET 请求从服务器加载 JSON 编码数据。
jQuery.getScript()	使用 HTTP GET 请求从服务器加载 JavaScript 文件,然后执行该文件。
.load()	从服务器加载数据,然后把返回到 HTML 放入匹配元素。
jQuery.param()	创建数组或对象的序列化表示,适合在 URL 查询字符串或 Ajax 请求中使用。
jQuery.post()	使用 HTTP POST 请求从服务器加载数据。
.serialize()	将表单内容序列化为字符串。
.serializeArray()	序列化表单元素,返回 JSON 数据结构数据。

Gitolite搭建git服务器

这段时间用Git用的很顺手很舒服,不过都是登陆自己的服务器写的代码。于是乎研究起了Git服务器。不过经过一天晚上的研究。最后发现还是gitlab舒服。大家直接用gitlab好了。这一篇就当纪念了😄

ps:在Git服务管理工具这个领域,除了刚提到gitlab和gitolite之外,还有 Gitosis 和 Git + Repo + Gerrit 的方案。其中Git + Repo + Gerrit是超级重量级的方案,集版本控制,库管理和代码审核为一身。可管理大型及超大型项目。 大名鼎鼎的Android平台就是使用的 Git + Repo + Gerrit。

pps:gitlab可以使用这个脚本一键安装。https://bitnami.com/stack/gitlab/installer

简介

Gitolite是在Git之上的一个授权层,依托sshd或者httpd来进行认证。(概括:认证是确定用户是谁,授权是决定该用户是否被允许做他想做的事情)。

第一步,安装git:

$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

$ sudo adduser --system --shell /bin/bash --gecos 'Git SCM User' --group --disabled-password --home /home/git git

第三步,创建证书登录: 收集所有需要登录的用户的公钥,把所有公钥导入到/home/git/.ssh/authorized_keys文件里。

第四步,下载源码并安装:

$ sudo su git
$ cd $HOME
$ git clone http://github.com/sitaramc/gitolite

安装Gitolite(服务器端)

$ mkdir -p ${HOME}/bin
$ ${HOME}/gitolite/install -to ${HOME}/bin

设置SSH public key(服务器端)

$ ${HOME}/bin/gitolite setup -pk xxx.pub // 你的公钥

到这里,Gitolite已经安装完成。

第五步:克隆Gitolite管理库(客户端)

在客户端上设置ssh的配置文件,config。例如:

Host    gitolite
  HostName        199.199.199.199
  Port            1999
  User            git
  IdentityFile    ~/.ssh/xxx

然后只需要在本地服务器上使用如下代码下载。

$ git clone gitolite:gitolite-admin.git

这只是一篇非常非常简约的安装记录,更多的配置和问题请参考相关的资料:

  • [服务器上的 Git - Gitolite git-scm](http://git-scm.com/book/zh/ch4-8.html)
  • [使用Gitolite搭建轻量级的Git服务器 chinaunix](http://blog.chinaunix.net/uid-15174104-id-3843570.html)
  • Gitolite 构建 Git 服务器

数据库入门

前几天写的git入门,在开发的时候还蛮用的上的。目前对MySQL的掌握也比较薄弱,一鼓作气,把一些数据库的知识也归纳一下。

MySQL

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。

根据存储模型划分,数据库类型主要可分为

  • 网状数据库(Network Database)
  • 关系数据库(Relational Database)
  • 树状数据库(Hierarchical Database)
  • 面向对象数据库(Object-oriented Database)等。

简介

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购.对于Mysql的前途,没有任何人抱乐观的态度.目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

在关系数据库模型中,二维表的列称为属性或者说是字段,二维表的行称为记录或者说是元组。

特性

  • 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
  • 支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统   
  • 为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。   
  • 支持多线程,充分利用CPU资源   
  • 优化的SQL查询算法,有效地提高查询速度   
  • 既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名   
  • 提供TCP/IP、ODBC和JDBC等多种数据库连接途径   
  • 提供用于管理、检查、优化数据库操作的管理工具   
  • 可以处理拥有上千万条记录的大型数据

与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。

代码

ps:因为我使用MySQL的机会并不是很多,记到哪算哪吧。

常用步骤数据库

# mysql -u root -p		# 然后输入MySQL密码
# mysql> show databases;
# mysql> use xxx
# mysql> show tables;
# mysql> SELECT * from xxxtable WHERE Column='Sanjay';
# mysql> desc department;
mysql> exit				# 退出

表结构修改

增加列

①alter table 表名 add 列名 列类型 列参数【加的列在表的最后面】
alter table test add username char(20) not null default '';
alter table test add birth date not null default '0000-00-00';

②alter table 表名 add 列名 列类型 列参数 after 某列【把新列加在某列后面】
alter table test add gender char(1) not null default '' after username;

③alter table 表名 add 列名 列类型 列参数 first【把新列加在最前面】
alter table test add pid int not null default 0 first;

未完待续…

待思考: 向上扩展 水平扩展


在bash脚本中引用其他脚本

fork

这是最常用的调用方式,直接指定要调用的脚本的名字,也可以指定要使用的shell,比如

  sh ${scriptname}
  bash ${scriptname}

如果不指定使用的shell名称,则根据脚本的shebang来确定使用的脚本解释器。

这种方式,shell会为调用脚本fork一个子进程来执行被调用的脚本。子进程继承父进程的环境变量,子进程结束时会有退出状态给父进程。

source(.)

source或. 是bash的内建命令,在命令行上执行的时候,将会直接执行被调用脚本。在脚本内source另一个脚本时,会将被调用脚本插入到调用脚本,并执行这些脚本。因此调用脚本和被调用脚本可以相互访问彼此的变量。类似C/C++语言的include语句。

exec

这是 shell 的内建命令,将使用被调用脚本来取代当前进程,当被调用脚本执行完毕后,调用脚本也随之结束。


屏幕录制软件LICEcap

今天在给KeluLinuxKit写README的时候,想到编辑器们宣传自己的时候经常带有操作的gif图,觉得棒棒的。今天找了一下果然找到了。确实是居家旅行必备神器啊!

名字叫 LICEcap 小巧实用,Windows和Mac都支持哦!来看看效果吧。也可以直接在在github上看代码:https://github.com/lepht/licecap

maximum awesome


Git 入门

一、诞生

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

二、安装

请参考 Github 上的教程。

三、配置

Git 提供了 git config 工具,专门用来配置或读取相应的工作环境变量。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件。
  • 工作目录中的 .git/config 文件:这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

配置用户信息

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
$ git config --global core.editor emacs
$ git config --global merge.tool vimdiff

查看配置信息

要检查已有的配置信息,可以使用 git config –list 命令:

$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。

也可以直接查阅某个环境变量的设定。

$ git config user.name
Scott Chacon

设置快捷键

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'
$ git config --global alias.last 'log -1 HEAD'

自动补全

wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
mv git-completion.bash /etc/bash_completion.d/

四、初始化

以下内容过多,详细内容请查看这本教程:《Pro Git 2nd Edition》

配置与 github 的连接

ssh-agent bash
ssh-agent -s
ssh-add ~/.ssh/xxx@xxx.com
ssh -T git@github.com

配置代理

参考这篇文章 —— 《git 国内加速代理》

初始化设置

git config --global user.name "xxx"
git config --global user.email "xxx@xxx.com"
git config --global pull.rebase true # 设置默认使用 rebase 而不用 merge
git branch --set-upstream master origin/master # 设置默认分支
git push --set-upstream origin master # 设置默认分支

拉取全新新项目

git clone xxx.git
cd test
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

已有文件夹中创建项目

cd existing_folder
git init
git remote add origin xxx.git
git add .
git commit -m "Initial commit"
git push -u origin master

关联已有项目

cd existing_repo
git remote add origin xxx.git
git push -u origin --all
git push -u origin --tags

取消关联

git remote remove origin

重新设置远程仓库并关联新分支

方法一 直接修改
git remote xxx 查看指定远程仓库地址
git remote set-url origin git@github.com:kelvinblood/KeluLinuxKit.git
方法二 先删除再添加
git remote rm origin
git remote add origin git@github.com:kelvinblood/KeluLinuxKit.git
方法三 修改配置文件

进入git_test/.git 文件夹

[core] 
repositoryformatversion = 0 
filemode = true 
logallrefupdates = true 
precomposeunicode = true 
[remote "origin"] 
url = git@github.com:kelvinblood/KeluLinuxKit.git
fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
remote = origin 
merge = refs/heads/master
关联本地分支与远程分支
git branch --set-upstream-to=origin/remote_branch  your_branch

.gitignore

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt

克隆指定深度

git clone --depth=1 git://someserver/somerepo

depth 用于指定克隆深度,为1即表示只克隆最近一次commit.

创建新的空白分支(孤儿分支)

创建为孤儿分支:

git checkout --orphan <branchname>

然后清除仓库中的缓存:

git rm --cached -r .

删除所有文件:

rm -rf *
echo '' > .gitignore

初始化提交

touch readme
git add .
git commit -m "init"

push

git push --set-upstream origin <branchname>

五、编辑操作

拉新分支

git checkout --track -b komachi origin/komachi

追加提交

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

撤销提交

$ git checkout -- benchmarks.rb
$ git reset HEAD benchmarks.rb
$ git reset --soft xxx
$ git reset --hard xxx

文件对比

$ git diff		# 看暂存前后的变化
$ git diff --cached # 查看已经暂存起来的变化:
$ git rm 记录此次移除文件
$ git mv file_from file_to

查看一个文件的修改历史

$ git log [file_name]

查看文件每一行的提交记录

当事情出错时,先去指责别人是人类的天性之一。如果你的产品服务器挂了,使用git blame命令可以很容易找出罪魁祸首。这个命令可以将文件中的每一行的作者、最新的变更提交和提交时间展示出来。

$ git blame [file_name]

提交历史

$ git log -p -2			# 最近的两次更新
$ git log --pretty=format:"%h %cr %s" --graph
	--oneline- 压缩模式,以一行显示
	--graph- 图形模式
	--all- 显示所有
$ git log -n 1 --stat 	# 查看上次提交影响的文件
$ git reflog 			# 本地的历史节点

git reflog列出了head曾经指向过的一系列commit。要明白它们只存在于你本机中;而不是你的版本仓库的一部分,也不包含在push和merge操作中。

log的一些选项以及释义

选项	说明
-p	按补丁格式显示每个更新之间的差异。
--word-diff	按 word diff 格式显示差异。
--stat	显示每次更新的文件修改统计信息。
--shortstat	只显示 --stat 中最后的行数修改添加移除统计。
--name-only	仅在提交信息后显示已修改的文件清单。
--name-status	显示新增、修改、删除的文件清单。
--abbrev-commit	仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date	使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph	显示 ASCII 图形表示的分支合并历史。
--pretty	使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
--oneline	--pretty=oneline --abbrev-commit 的简化用法。

六、打包导出

标签

$ git tag v1.4-lw # 创建tag
$ git tag -n # 显示已有tag

$ git ls-remote --tags origin # 显示远端tag
$ git fetch --all --tags # 拉取最新tag

$ git checkout tags/v1.20.2 # 切换到tag
$ git checkout -b v1.20.2 tags/v1.20.2 # 切换到tag并创建分支

冲突

如果合并出现冲突,则修改冲突文件,并删除 «««<,======= 和 »»»> 这些行。在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决状态,再运行一次 git status 来确认所有冲突都已解决.

导出

Git提供了archive命令,可以导出一个干净的项目文档,不包括版本控制文件。

git archive --format zip -o kelu.zip HEAD
git archive -–format zip -o site-$(git log –pretty=format:”%h” -1).zip HEAD

git archive --format zip --output /path/to/file.zip master # 将 master 以zip格式打包到指定文件

导出最近一次提交的 Git 变更文件

这个命令是和gpt讨论出来的。

git archive -o "$(basename "$(pwd)").zip" HEAD $(git diff --name-only HEAD^ HEAD)

七、分支相关

本地分支

$ git branch testing 	# 新建分支	
$ git checkout testing 	# 切换分支
$ git checkout -b iss53 # 新建并切换到分支
$ git branch -d hotfix  # 删除分支
$ git merge iss53		# 合并分支到当前分支

远程分支

$ git push origin dev  # 生成远程dev分支
$ git push origin feature
$ git branch -r 		# 查看远程分支
$ git checkout --track origin/dev		# 从远程拉取并切换到dev分支
$ git checkout -b develop origin/dev	# 从远程拉取dev命名为develop,并切换
$ git push origin dev:dev				# 提交本地分支,如果在dev分支下工作,可直接git push
$ git push origin :dev				# 删除远程分支
$ git fetch origin					# 同步本地远程分

现场存储

当你正在开发一个功能时,突然boss让你尽快修改一个bug,此时最紧急的是fix bug. 而正开发的功能尚未完善还不能提交,这个时候就会想到能不能将手头的工作隔离开,去单单解决bug,然后提交bug,然后在进行手头工作。

$ git stash  #把当前工作现场“储藏”起来	
$ git stash pop # 还原成最新的现场,并删除stash列表里的这个存储
$ git stash apply #重新回来原来的工作时,只需把Stash区域的内容取出来应用到当前工作目录就行
$ git stash apply stash@{1} #应用某一个队列
$ git stash list #查看所有stash列表
$ git stash show #显示stash的内容具体是什么,同git stash apply一样,可以选择指定stash的名字。

git stash apply之后再git stash list会发现,apply后的stash还在stash列表中,如果要将其从stash列表中删除可以用:

$ git stash drop	#丢弃这个stash,stash的命令参数都可选择指定stash名字,否则就是最新的stash。
$ git stash pop #是应用与删除的快捷,一个命令即可
$ git stash apply --index #维持原来的样子,原来暂存的文件仍然是暂存状态,可以加上--index参数,否则都将变成未暂存状态

分支衍合merge

把一个分支整合到另一个分支有两种方法:merge和rebase(衍合) merge是把两个分支最新的快照和二者最新的共同祖先进行三方合并,产生一个新的提交对象。

$ git merge issueFix

如果没有冲突的话,merge完成。有冲突的话,git会提示那个文件中有冲突,比如有如下冲突:

	<<<<<<< HEAD:test.c	
	printf (“test1″);
	=======
	printf (“test2″);
	>>>>>>> issueFix:test.c

merge有两个参数,

git merge --no-ff指的是强行关闭fast-forward方式。

fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,有个地方不好的就是不能显示历史信息,在以后开发中我不知道有哪些分支曾经合并过,所以最好使用 no-ff:no fast forward的合并方式,这种方式在合并的同时会生成一个新的commit,这样,从分支历史上就可以看出分支信息。

$ git merge --no-ff -m "merge with no-ff" dev

git merge --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

总结: –no-ff:不使用fast-forward方式合并,保留分支的commit历史 –squash:使用squash方式合并,把多次分支commit历史压缩为一次

image

分支衍合cherry-pick

ps:Cherry-pick的内容转载自Git笔记(三) - 进击的马斯特

cherry-pick其实在工作中还挺常用的,一种常见的场景就是,比如我在A分支做了几次commit以后,发现其实我并不应该在A分支上工作,应该在B分支上工作,这时就需要将这些commit从A分支复制到B分支去了,这时候就需要cherry-pick命令了,B分支指着这些commit说:妈妈,我也要!

比如说,我们在master分支上继续做两次提交,第一次添加一行”test 10”,git commit -am "commit 10",第二次添加“test 11”,到达如下图的状态:

图25

这个时候我们发现,哦NO,我们不应该直接更改master分支,我们应该在自己的分支上做提交。这个时候先新建一个分支git checkout -b branch3 1a222c3,注意这里的最后一个参数是新分支的起点,也就是说,新的分支branch3是从“commit 8,9”开始的,现在我们需要把刚才的两次提交移动到新的分支上。运行git cherry-pick 0bda20e 1a04d5f,命令行会给出提示两个commit被复制到了当前分支上,此时SourceTree的状态如下图:

图26 确定这两个commit被复制到指定分支以后,在master分支上将这两个commit删除。先切回master分支:git checkout master,运行git reset --hard 1a222c3,此时SourceTree的状态图为:

图27 两个commit被成功的从master分支移动到了branch3分支。

分支衍合rebase

rebase是回到两个分支的共同祖先,根据要进行衍合的分支dev的历次提交对象,生成一系列文件补丁,然后以主干分支master的最后一个提交对象为新的出发点,逐个应用dev分支准备好的补丁文件,生成一个新的提交对象,改写dev的提交历史,使dev成为master的直接下游。然后回到master分支,进行一次快进合并。这样能够保持更加清晰的提交记录,就像没有使用过分支一样。

$ git checkout dev
$ git rebase master

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

八、常用配置

git config --global user.name "kelu"
git config --global user.email admin@kelu.org
git config --global core.editor vim
git config --global merge.tool vimdiff
git config --global core.quotepath false
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
git config --global http.https://github.com.proxy 'socks5://xxx:1080'

git config --edit
git config --list

ssh的一些介绍

很久没有写blog了,刚刚想找一下markdown快捷键的文档都找不到了Orz。果然是逆水行舟,很久没磨练技术,技能都已经生疏了。于是从今天开始,针对每天开发时遇到的一些小问题,记录一篇(希望如此)。

前言

SSH全称Secure SHell,SSH协议是IETF(Internet Engineering Task Force)的Network Working Group所制定的一种协议。SSH的主要目的是用来取代传统的telnet和R系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具,实现对远程登陆和远程执行命令加密。防止由于网络监听而出现的密码泄漏,对系统构成威胁。

在出现SSH之前,系统管理员需要登入远程服务器执行系统管理任务时,都是用telnet来实现的,telnet协议采用明文密码传送,在传送过程中对数据也不加密,很容易被不怀好意的人在网络上监听到密码。同样,在SSH工具出现之前R系列命令也很流行(由于这些命令都以字母r开头,故把这些命令合称为R系列命令R是remote的意思),比如rexec是用来执行远程服务器上的命令的,和telnet的区别是telnet需要先登陆远程服务器再实行相关的命令,而R系列命令可以把登陆和执行命令并登出系统的操作整合在一起。这样就不需要为在远程服务器上执行一个命令而特地登陆服务器了。

ssh协议目前有SSH1和SSH2,SSH2协议兼容SSH1。目前实现SSH1和SSH2协议的主要软件有OpenSSH和SSH Communications Security Corporation 公司的SSH Communications 软件。前者是OpenBSD组织开发的一款免费的SSH软件,后者是商业软件,因此在linux、FreeBSD、OpenBSD、NetBSD等免费类UNIX系统种,通畅都使用OpenSSH作为SSH协议的实现软件。需要注意的是OpenSSH和SSH Communications的登陆公钥/私钥的格式是不同的,如果想用SSH Communications产生的私钥/公钥对来登入到使用OpenSSH的linux系统需要对公钥/私钥进行格式转换。

OpenSSH的命令

sshd ―― SSH服务端程序
sftp-server ―― SFTP服务端程序(类似FTP但提供数据加密的一种协议)
scp ―― 非交互式sftp-server的客户端,用来向服务器上传/下载文件
sftp ―― 交互式sftp-server客户端,用法和ftp命令一样。
slogin ―― ssh的别名
ssh ―― SSH协议的客户端程序,用来登入远程系统或远程执行命令
ssh-add ――    SSH代理相关程序,用来向SSH代理添加dsa key
ssh-agent ――    ssh代理程序
ssh-keyscan ―― ssh public key 生成器

SSH最常用的使用方式是代替telnet进行远程登陆。不同于telnet的密码登陆,SSH还同时支持Publickey、Keybord Interactive、GSSAPI等多种登入方式,不像telnet那样只有输入系统密码一种途径。目前最常用的登陆方式还是传统的Password方式和Publickey方式登陆。

生成公钥私钥

首先在本地生成密钥

# ssh-keygen -b 1024 -t rsa -C your.email -f ~/.ssh/your.email

产生的公钥/私钥文件在用户home目录的.ssh目录下,其中xxx.pub是公钥,把产生的公钥上传到需要登陆的服务器的对应用户目录的home目录的.ssh目录下,.ssh目录的权限必须是700,否则ssh服务器会拒绝登陆。ssh默认的公钥文件是用户home目录下的.ssh目录下的authorized_keys文件,因此需要把产生的公钥以这个文件名放到服务器的/root/.ssh/目录下,这个文件中可以存放多个客户端的公钥文件.

私钥必须是600权限,否则ssh服务器会拒绝用户登陆。

本地配置

如果拥有多个 ssh 账号,要记住每个ssh 账号的参数,还是非常麻烦的事情。ssh 提供一种优雅且灵活的方式来解决这个问题,就是利用 ssh 的用户配置文件 config 管理 ssh 会话。ssh 的用户配置文件是放在当前用户根目录下的 .ssh 文件夹里(~/.ssh/config,不存在则新创建一个),其配置写法如下:

Host    别名
    HostName        主机名
    Port            端口
    User            用户名
    IdentityFile    密钥文件的路径

有了这些配置,就可以这样用 ssh 登陆服务器了:

ssh 别名

登录命令

# ssh hostname
# ssh -p xxx username@hostname
# ssh 别名

服务器配置

一共有两个配置文件 /etc/ssh/ssh_config 和 /etc/ssh/sshd_config