github

github

React 如何跨组件进行通信?组件和组件之间如何通信?

前端开发atool 发表了文章 • 0 个评论 • 1365 次浏览 • 2016-07-15 17:04 • 来自相关话题

react最近在项目中用的很爽,不用操作js dom会方便很多;另外组件的封装,state绑定界面,爽的不要不要的。
 
但是项目中经常会遇到跨组件的通信。这个可以分成两类:
一类是父组件和子组件之见的通信;
一类是完全两个不相干的组件之前的通信,通常这两个组件是由路由(router)分割开了。
 
分别介绍一下,对于第一类:父子组件的通信,其实很容易通过子组件传递一个function类型的属性来解决,示例如下:
const Parent = React.createClass({
test_func: function(data) {
},
render: function(){
<Child funcProp={this.test_func} />
}
});

const Child = React.createClass({
propTypes: {
funcProp: React.PropTypes.func
},
componentDidUpdate: function() {
this.props.funcProp('send data to parent');
},
render: function(){
<div>child component.</div>
}
});通过子组件的 funcProp 属性方法就可以进行消息发送和通信。这种方式对于两个组件直接父子关系还比较好用,但是对于跨级的父子组件(实际上已经可以叫做爷子组件),或者评级的兄弟组件,他们之间的通信就比较麻烦了,需要传递好几层的数据。
 
这种情况我们都可以和第二类算作一起,作为跨组件的通信。我在项目中同样也遇到了,所以封装了一个简单的实现,大小才0.7kb左右,非常精简。代码为:https://github.com/hustcc/onfire.js
 
安装 npm install onfire.js
使用实例:
import onfire from 'onfire.js';

// 绑定事件
var eventObj = onfire.on('test_event', function(data) {
console.log('this is a event 1');
});
var eventObj2 = onfire.on('test_event', function(data) {
console.log('this is a event 2');
});

// 触发事件
onfire.fire('test_event', 'test_data');

// 取消绑定
onfire.un(eventObj); // 取消绑定这个事件.
onfire.un('test_event'); // 取消绑定所有的 `test_event`.

// 长度
onfire.size();当然这个库也可以直接使用script标签引入使用。
 
  查看全部
react最近在项目中用的很爽,不用操作js dom会方便很多;另外组件的封装,state绑定界面,爽的不要不要的。
 
但是项目中经常会遇到跨组件的通信。这个可以分成两类:
一类是父组件和子组件之见的通信;
一类是完全两个不相干的组件之前的通信,通常这两个组件是由路由(router)分割开了。
 
分别介绍一下,对于第一类:父子组件的通信,其实很容易通过子组件传递一个function类型的属性来解决,示例如下:
const Parent = React.createClass({
test_func: function(data) {
},
render: function(){
<Child funcProp={this.test_func} />
}
});

const Child = React.createClass({
propTypes: {
funcProp: React.PropTypes.func
},
componentDidUpdate: function() {
this.props.funcProp('send data to parent');
},
render: function(){
<div>child component.</div>
}
});
通过子组件的 funcProp 属性方法就可以进行消息发送和通信。这种方式对于两个组件直接父子关系还比较好用,但是对于跨级的父子组件(实际上已经可以叫做爷子组件),或者评级的兄弟组件,他们之间的通信就比较麻烦了,需要传递好几层的数据。
 
这种情况我们都可以和第二类算作一起,作为跨组件的通信。我在项目中同样也遇到了,所以封装了一个简单的实现,大小才0.7kb左右,非常精简。代码为:https://github.com/hustcc/onfire.js
 
安装 npm install onfire.js
使用实例:
import onfire from 'onfire.js';

// 绑定事件
var eventObj = onfire.on('test_event', function(data) {
console.log('this is a event 1');
});
var eventObj2 = onfire.on('test_event', function(data) {
console.log('this is a event 2');
});

// 触发事件
onfire.fire('test_event', 'test_data');

// 取消绑定
onfire.un(eventObj); // 取消绑定这个事件.
onfire.un('test_event'); // 取消绑定所有的 `test_event`.

// 长度
onfire.size();
当然这个库也可以直接使用script标签引入使用。
 
 

Git常用命令

软件工程atool 发表了文章 • 0 个评论 • 660 次浏览 • 2016-04-25 14:17 • 来自相关话题

一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
workspace: 本地的工作目录。(记作A)index:缓存区域,临时保存本地改动。(记作B)local repository: 本地仓库,只想最后一次提交HEAD。(记作C)remote repository:远程仓库。(记作D)
 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
  查看全部
一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
  • workspace: 本地的工作目录。(记作A)
  • index:缓存区域,临时保存本地改动。(记作B)
  • local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
  • remote repository:远程仓库。(记作D)

 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名
操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容
撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A
分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A
冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功
其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
 

Git常用命令和Git团队使用规范指南

软件工程atool 发表了文章 • 0 个评论 • 670 次浏览 • 2016-04-25 14:12 • 来自相关话题

一、前言
在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。
 
Git是目前世界上最先进的分布式版本控制系统
 
二、SVN与Git的最主要的区别
 
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
 
三、Git搭建和使用
 
Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程
 
3.1 Git服务端
 
服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab。#安装git
sudo apt-get install git
yum install git

#创建一个git用户,用来运行git服务
sudo adduser git

#创建证书使用公钥免密码登录(可选)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys

#初始化Git仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git

#禁用shell登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

#在客户端上克隆远程仓库
git clone git@server:/srv/sample.git
3.2 Git客户端

Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的。
Git - https://git-scm.com/  
TortoiseGit - https://tortoisegit.org/  
SourceTree - https://www.sourcetreeapp.com/#以最基本的Git命令行为例,先下载Git
https://git-scm.com/download/

#配置git提交用户名和邮箱,定义别名方便区分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"

#克隆仓库
git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

#测试推送
touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master
四、Git常用命令
 
符号约定
<xxx> 自定义内容
[xxx] 可选内容
[<xxx>]自定义可选内容#初始设置
git config --global user.name "<用户名>" #设置用户名
git config --global user.email "<电子邮件>" #设置电子邮件

#本地操作
git add [-i] #保存更新,-i为逐个确认。
git status #检查更新。
git commit [-a] -m "<更新说明>" #提交更新,-a为包含内容修改和增删,-m为说明信息,也可以使用 -am。

#远端操作
git clone <git地址> #克隆到本地。
git fetch #远端抓取。
git merge #与本地当前分支合并。
git pull [<远端别名>] [<远端branch>] #抓取并合并,相当于第2、3步
git push [-f] [<远端别名>] [<远端branch>] #推送到远端,-f为强制覆盖
git remote add <别名> <git地址> #设置远端别名
git remote [-v] #列出远端,-v为详细信息
git remote show <远端别名> #查看远端信息
git remote rename <远端别名> <新远端别名> #重命名远端
git remote rm <远端别名> #删除远端
git remote update [<远端别名>] #更新分支列表

#分支相关
git branch [-r] [-a] #列出分支,-r远端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切换分支
git branch -d <分支名> #删除分支
git checkout <分支名> #切换到分支
git checkout -b <本地branch> [-t <远端别名>/<远端分支>] #-b新建本地分支并切换到分支, -t绑定远端分支
git merge <分支名> #合并某分支到当前分支





workspace: 本地的工作目录。(记作A)
index:缓存区域,临时保存本地改动。(记作B)
local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
remote repository:远程仓库。(记作D)
 
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。#初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名

#操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容

#撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A

#分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A

#冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功

#其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
五、Git使用规范
 
5.1 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
5.2 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
5.3 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
5.4 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
5.5 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
5.6 review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
 
  查看全部
fAhm82RJ.png

一、前言
在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。
 
Git是目前世界上最先进的分布式版本控制系统
 
二、SVN与Git的最主要的区别
 
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
 
三、Git搭建和使用
 
Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程
 
3.1 Git服务端
 
服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab。
#安装git
sudo apt-get install git
yum install git

#创建一个git用户,用来运行git服务
sudo adduser git

#创建证书使用公钥免密码登录(可选)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys

#初始化Git仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git

#禁用shell登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

#在客户端上克隆远程仓库
git clone git@server:/srv/sample.git

3.2 Git客户端

Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的。
Git - https://git-scm.com/  
TortoiseGit - https://tortoisegit.org/  
SourceTree - https://www.sourcetreeapp.com/
#以最基本的Git命令行为例,先下载Git
https://git-scm.com/download/

#配置git提交用户名和邮箱,定义别名方便区分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"

#克隆仓库
git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

#测试推送
touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master

四、Git常用命令
 
符号约定
<xxx> 自定义内容
[xxx] 可选内容
[<xxx>]自定义可选内容
#初始设置
git config --global user.name "<用户名>" #设置用户名
git config --global user.email "<电子邮件>" #设置电子邮件

#本地操作
git add [-i] #保存更新,-i为逐个确认。
git status #检查更新。
git commit [-a] -m "<更新说明>" #提交更新,-a为包含内容修改和增删,-m为说明信息,也可以使用 -am。

#远端操作
git clone <git地址> #克隆到本地。
git fetch #远端抓取。
git merge #与本地当前分支合并。
git pull [<远端别名>] [<远端branch>] #抓取并合并,相当于第2、3步
git push [-f] [<远端别名>] [<远端branch>] #推送到远端,-f为强制覆盖
git remote add <别名> <git地址> #设置远端别名
git remote [-v] #列出远端,-v为详细信息
git remote show <远端别名> #查看远端信息
git remote rename <远端别名> <新远端别名> #重命名远端
git remote rm <远端别名> #删除远端
git remote update [<远端别名>] #更新分支列表

#分支相关
git branch [-r] [-a] #列出分支,-r远端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切换分支
git branch -d <分支名> #删除分支
git checkout <分支名> #切换到分支
git checkout -b <本地branch> [-t <远端别名>/<远端分支>] #-b新建本地分支并切换到分支, -t绑定远端分支
git merge <分支名> #合并某分支到当前分支

1_(1).png

workspace: 本地的工作目录。(记作A)
index:缓存区域,临时保存本地改动。(记作B)
local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
remote repository:远程仓库。(记作D)
 
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。
#初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名

#操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容

#撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A

#分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A

#冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功

#其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区

五、Git使用规范
 
5.1 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
5.2 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
5.3 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
5.4 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
5.5 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
5.6 review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
 
 

一个轻量级 Python 装饰器的缓存库——wrapcache

服务端atool 发表了文章 • 0 个评论 • 764 次浏览 • 2016-04-22 13:22 • 来自相关话题

A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache




 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instanceREDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。 查看全部
A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache
未命名.png

 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。
import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)
以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instance
REDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存
四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。

github如何发起一个push request注意事项

软件工程atool 发表了文章 • 0 个评论 • 896 次浏览 • 2016-04-22 13:11 • 来自相关话题

github发起一个push request步骤

1、在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可。

如: 其中# upstream 表示上游代码库名, 可以任意。
git remote add upstream git@github.com:hustcc/dig_hash.git2、将本地的修改提交 commit

3、在每次 Pull Request 前做如下操作,即可实现和上游版本库的同步。

3.1 更新源项目的代码到最新 
git remote update upstream3.2 rebase最新代码

注意在rebase之前,将自己项目切换到对应的branch,如:
git checkout develop然后:
git rebase upstream/{branch name}需要注意的是在操作3.2之前,一定要将checkout到{branch name}所指定的branch,如:
git checkout develop4、 Push 代码到 Github
git push origin {branch name}5、push request
到github网页上发起push request即可。 查看全部
github发起一个push request步骤

1、在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可。

如: 其中# upstream 表示上游代码库名, 可以任意。
git remote add upstream git@github.com:hustcc/dig_hash.git
2、将本地的修改提交 commit

3、在每次 Pull Request 前做如下操作,即可实现和上游版本库的同步。

3.1 更新源项目的代码到最新 
git remote update upstream
3.2 rebase最新代码

注意在rebase之前,将自己项目切换到对应的branch,如:
git checkout develop
然后:
git rebase upstream/{branch name}
需要注意的是在操作3.2之前,一定要将checkout到{branch name}所指定的branch,如:
git checkout develop
4、 Push 代码到 Github
git push origin {branch name}
5、push request
到github网页上发起push request即可。

Git常用命令

软件工程atool 发表了文章 • 0 个评论 • 660 次浏览 • 2016-04-25 14:17 • 来自相关话题

一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
workspace: 本地的工作目录。(记作A)index:缓存区域,临时保存本地改动。(记作B)local repository: 本地仓库,只想最后一次提交HEAD。(记作C)remote repository:远程仓库。(记作D)
 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
  查看全部
一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
  • workspace: 本地的工作目录。(记作A)
  • index:缓存区域,临时保存本地改动。(记作B)
  • local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
  • remote repository:远程仓库。(记作D)

 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名
操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容
撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A
分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A
冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功
其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
 

一个轻量级 Python 装饰器的缓存库——wrapcache

服务端atool 发表了文章 • 0 个评论 • 764 次浏览 • 2016-04-22 13:22 • 来自相关话题

A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache




 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instanceREDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。 查看全部
A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache
未命名.png

 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。
import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)
以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instance
REDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存
四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。

React 如何跨组件进行通信?组件和组件之间如何通信?

前端开发atool 发表了文章 • 0 个评论 • 1365 次浏览 • 2016-07-15 17:04 • 来自相关话题

react最近在项目中用的很爽,不用操作js dom会方便很多;另外组件的封装,state绑定界面,爽的不要不要的。
 
但是项目中经常会遇到跨组件的通信。这个可以分成两类:
一类是父组件和子组件之见的通信;
一类是完全两个不相干的组件之前的通信,通常这两个组件是由路由(router)分割开了。
 
分别介绍一下,对于第一类:父子组件的通信,其实很容易通过子组件传递一个function类型的属性来解决,示例如下:
const Parent = React.createClass({
test_func: function(data) {
},
render: function(){
<Child funcProp={this.test_func} />
}
});

const Child = React.createClass({
propTypes: {
funcProp: React.PropTypes.func
},
componentDidUpdate: function() {
this.props.funcProp('send data to parent');
},
render: function(){
<div>child component.</div>
}
});通过子组件的 funcProp 属性方法就可以进行消息发送和通信。这种方式对于两个组件直接父子关系还比较好用,但是对于跨级的父子组件(实际上已经可以叫做爷子组件),或者评级的兄弟组件,他们之间的通信就比较麻烦了,需要传递好几层的数据。
 
这种情况我们都可以和第二类算作一起,作为跨组件的通信。我在项目中同样也遇到了,所以封装了一个简单的实现,大小才0.7kb左右,非常精简。代码为:https://github.com/hustcc/onfire.js
 
安装 npm install onfire.js
使用实例:
import onfire from 'onfire.js';

// 绑定事件
var eventObj = onfire.on('test_event', function(data) {
console.log('this is a event 1');
});
var eventObj2 = onfire.on('test_event', function(data) {
console.log('this is a event 2');
});

// 触发事件
onfire.fire('test_event', 'test_data');

// 取消绑定
onfire.un(eventObj); // 取消绑定这个事件.
onfire.un('test_event'); // 取消绑定所有的 `test_event`.

// 长度
onfire.size();当然这个库也可以直接使用script标签引入使用。
 
  查看全部
react最近在项目中用的很爽,不用操作js dom会方便很多;另外组件的封装,state绑定界面,爽的不要不要的。
 
但是项目中经常会遇到跨组件的通信。这个可以分成两类:
一类是父组件和子组件之见的通信;
一类是完全两个不相干的组件之前的通信,通常这两个组件是由路由(router)分割开了。
 
分别介绍一下,对于第一类:父子组件的通信,其实很容易通过子组件传递一个function类型的属性来解决,示例如下:
const Parent = React.createClass({
test_func: function(data) {
},
render: function(){
<Child funcProp={this.test_func} />
}
});

const Child = React.createClass({
propTypes: {
funcProp: React.PropTypes.func
},
componentDidUpdate: function() {
this.props.funcProp('send data to parent');
},
render: function(){
<div>child component.</div>
}
});
通过子组件的 funcProp 属性方法就可以进行消息发送和通信。这种方式对于两个组件直接父子关系还比较好用,但是对于跨级的父子组件(实际上已经可以叫做爷子组件),或者评级的兄弟组件,他们之间的通信就比较麻烦了,需要传递好几层的数据。
 
这种情况我们都可以和第二类算作一起,作为跨组件的通信。我在项目中同样也遇到了,所以封装了一个简单的实现,大小才0.7kb左右,非常精简。代码为:https://github.com/hustcc/onfire.js
 
安装 npm install onfire.js
使用实例:
import onfire from 'onfire.js';

// 绑定事件
var eventObj = onfire.on('test_event', function(data) {
console.log('this is a event 1');
});
var eventObj2 = onfire.on('test_event', function(data) {
console.log('this is a event 2');
});

// 触发事件
onfire.fire('test_event', 'test_data');

// 取消绑定
onfire.un(eventObj); // 取消绑定这个事件.
onfire.un('test_event'); // 取消绑定所有的 `test_event`.

// 长度
onfire.size();
当然这个库也可以直接使用script标签引入使用。
 
 

Git常用命令

软件工程atool 发表了文章 • 0 个评论 • 660 次浏览 • 2016-04-25 14:17 • 来自相关话题

一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
workspace: 本地的工作目录。(记作A)index:缓存区域,临时保存本地改动。(记作B)local repository: 本地仓库,只想最后一次提交HEAD。(记作C)remote repository:远程仓库。(记作D)
 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
  查看全部
一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
  • workspace: 本地的工作目录。(记作A)
  • index:缓存区域,临时保存本地改动。(记作B)
  • local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
  • remote repository:远程仓库。(记作D)

 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名
操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容
撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A
分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A
冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功
其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
 

Git常用命令和Git团队使用规范指南

软件工程atool 发表了文章 • 0 个评论 • 670 次浏览 • 2016-04-25 14:12 • 来自相关话题

一、前言
在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。
 
Git是目前世界上最先进的分布式版本控制系统
 
二、SVN与Git的最主要的区别
 
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
 
三、Git搭建和使用
 
Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程
 
3.1 Git服务端
 
服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab。#安装git
sudo apt-get install git
yum install git

#创建一个git用户,用来运行git服务
sudo adduser git

#创建证书使用公钥免密码登录(可选)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys

#初始化Git仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git

#禁用shell登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

#在客户端上克隆远程仓库
git clone git@server:/srv/sample.git
3.2 Git客户端

Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的。
Git - https://git-scm.com/  
TortoiseGit - https://tortoisegit.org/  
SourceTree - https://www.sourcetreeapp.com/#以最基本的Git命令行为例,先下载Git
https://git-scm.com/download/

#配置git提交用户名和邮箱,定义别名方便区分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"

#克隆仓库
git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

#测试推送
touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master
四、Git常用命令
 
符号约定
<xxx> 自定义内容
[xxx] 可选内容
[<xxx>]自定义可选内容#初始设置
git config --global user.name "<用户名>" #设置用户名
git config --global user.email "<电子邮件>" #设置电子邮件

#本地操作
git add [-i] #保存更新,-i为逐个确认。
git status #检查更新。
git commit [-a] -m "<更新说明>" #提交更新,-a为包含内容修改和增删,-m为说明信息,也可以使用 -am。

#远端操作
git clone <git地址> #克隆到本地。
git fetch #远端抓取。
git merge #与本地当前分支合并。
git pull [<远端别名>] [<远端branch>] #抓取并合并,相当于第2、3步
git push [-f] [<远端别名>] [<远端branch>] #推送到远端,-f为强制覆盖
git remote add <别名> <git地址> #设置远端别名
git remote [-v] #列出远端,-v为详细信息
git remote show <远端别名> #查看远端信息
git remote rename <远端别名> <新远端别名> #重命名远端
git remote rm <远端别名> #删除远端
git remote update [<远端别名>] #更新分支列表

#分支相关
git branch [-r] [-a] #列出分支,-r远端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切换分支
git branch -d <分支名> #删除分支
git checkout <分支名> #切换到分支
git checkout -b <本地branch> [-t <远端别名>/<远端分支>] #-b新建本地分支并切换到分支, -t绑定远端分支
git merge <分支名> #合并某分支到当前分支





workspace: 本地的工作目录。(记作A)
index:缓存区域,临时保存本地改动。(记作B)
local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
remote repository:远程仓库。(记作D)
 
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。#初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名

#操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容

#撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A

#分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A

#冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功

#其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
五、Git使用规范
 
5.1 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
5.2 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
5.3 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
5.4 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
5.5 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
5.6 review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
 
  查看全部
fAhm82RJ.png

一、前言
在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。
 
Git是目前世界上最先进的分布式版本控制系统
 
二、SVN与Git的最主要的区别
 
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
 
三、Git搭建和使用
 
Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程
 
3.1 Git服务端
 
服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab。
#安装git
sudo apt-get install git
yum install git

#创建一个git用户,用来运行git服务
sudo adduser git

#创建证书使用公钥免密码登录(可选)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys

#初始化Git仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git

#禁用shell登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

#在客户端上克隆远程仓库
git clone git@server:/srv/sample.git

3.2 Git客户端

Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的。
Git - https://git-scm.com/  
TortoiseGit - https://tortoisegit.org/  
SourceTree - https://www.sourcetreeapp.com/
#以最基本的Git命令行为例,先下载Git
https://git-scm.com/download/

#配置git提交用户名和邮箱,定义别名方便区分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"

#克隆仓库
git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

#测试推送
touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master

四、Git常用命令
 
符号约定
<xxx> 自定义内容
[xxx] 可选内容
[<xxx>]自定义可选内容
#初始设置
git config --global user.name "<用户名>" #设置用户名
git config --global user.email "<电子邮件>" #设置电子邮件

#本地操作
git add [-i] #保存更新,-i为逐个确认。
git status #检查更新。
git commit [-a] -m "<更新说明>" #提交更新,-a为包含内容修改和增删,-m为说明信息,也可以使用 -am。

#远端操作
git clone <git地址> #克隆到本地。
git fetch #远端抓取。
git merge #与本地当前分支合并。
git pull [<远端别名>] [<远端branch>] #抓取并合并,相当于第2、3步
git push [-f] [<远端别名>] [<远端branch>] #推送到远端,-f为强制覆盖
git remote add <别名> <git地址> #设置远端别名
git remote [-v] #列出远端,-v为详细信息
git remote show <远端别名> #查看远端信息
git remote rename <远端别名> <新远端别名> #重命名远端
git remote rm <远端别名> #删除远端
git remote update [<远端别名>] #更新分支列表

#分支相关
git branch [-r] [-a] #列出分支,-r远端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切换分支
git branch -d <分支名> #删除分支
git checkout <分支名> #切换到分支
git checkout -b <本地branch> [-t <远端别名>/<远端分支>] #-b新建本地分支并切换到分支, -t绑定远端分支
git merge <分支名> #合并某分支到当前分支

1_(1).png

workspace: 本地的工作目录。(记作A)
index:缓存区域,临时保存本地改动。(记作B)
local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
remote repository:远程仓库。(记作D)
 
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。
#初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名

#操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容

#撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A

#分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A

#冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功

#其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区

五、Git使用规范
 
5.1 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
5.2 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
5.3 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
5.4 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
5.5 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
5.6 review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
 
 

一个轻量级 Python 装饰器的缓存库——wrapcache

服务端atool 发表了文章 • 0 个评论 • 764 次浏览 • 2016-04-22 13:22 • 来自相关话题

A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache




 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instanceREDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。 查看全部
A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache
未命名.png

 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。
import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)
以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instance
REDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存
四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。

github如何发起一个push request注意事项

软件工程atool 发表了文章 • 0 个评论 • 896 次浏览 • 2016-04-22 13:11 • 来自相关话题

github发起一个push request步骤

1、在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可。

如: 其中# upstream 表示上游代码库名, 可以任意。
git remote add upstream git@github.com:hustcc/dig_hash.git2、将本地的修改提交 commit

3、在每次 Pull Request 前做如下操作,即可实现和上游版本库的同步。

3.1 更新源项目的代码到最新 
git remote update upstream3.2 rebase最新代码

注意在rebase之前,将自己项目切换到对应的branch,如:
git checkout develop然后:
git rebase upstream/{branch name}需要注意的是在操作3.2之前,一定要将checkout到{branch name}所指定的branch,如:
git checkout develop4、 Push 代码到 Github
git push origin {branch name}5、push request
到github网页上发起push request即可。 查看全部
github发起一个push request步骤

1、在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可。

如: 其中# upstream 表示上游代码库名, 可以任意。
git remote add upstream git@github.com:hustcc/dig_hash.git
2、将本地的修改提交 commit

3、在每次 Pull Request 前做如下操作,即可实现和上游版本库的同步。

3.1 更新源项目的代码到最新 
git remote update upstream
3.2 rebase最新代码

注意在rebase之前,将自己项目切换到对应的branch,如:
git checkout develop
然后:
git rebase upstream/{branch name}
需要注意的是在操作3.2之前,一定要将checkout到{branch name}所指定的branch,如:
git checkout develop
4、 Push 代码到 Github
git push origin {branch name}
5、push request
到github网页上发起push request即可。