git使用stash命令

今天在master下改了代码,又想新建一个分支。git flow init命令的时候提示:fatal: Working tree contains unstaged changes. Aborting. 然后搜索找到好的解决方法。 git stash命令 先git stash 将修改的代码备份,然后创建分支,切换到新分支,然后 git stash pop 就可以了 一下内容来自http://www.cppblog.com/deercoder/archive/2011/11/13/160007.html git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。 git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。 git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。 git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。 关于Git Stash的详细解释,适用场合,这里做一个说明: 使用git的时候,我们往往使用branch解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码 commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用'git stash'就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用'git stash apply'将以前一半的工作应用回来。也许有的人会说,那我可不可以多次将未提交的代码压入到栈中?答案是可以的。当你多次使用'git stash'命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,'git stash list'命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用'git stash apply stash@{1}'就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用'git stash clear'来将栈清空。 在这里顺便提下git format-patch -n , n是具体某个数字, 例如 'git format-patch -1' 这时便会根据log生成一个对应的补丁,如果 'git format-patch -2' 那么便会生成2个补丁,当然前提是你的log上有至少有两个记录。
Read more...

ubuntu virtualenv下crontab编写执行python脚本

crontab的基本用法: $ man crontab crontab -e 编辑并生产cronbat文件,也可以直接使用crontab 文件名 添加一个写好的crontab文件。 crontab -l 查看当前用户的crontab list。 crontab -r 删除所有crontab任务。 还有一个-u指定用户。   virtualenv环境下使用crontab: * * * * * /path/to/EVN/bin/python test.py > /path/to/log/test.log 在crontab脚本中指定使用哪一个python。  
Read more...

Nginx, Uwsgi, Virtualenv and Django on Ubuntu 12.04

参考资料: http://eshlox.net/en/2012/09/11/nginx-uwsgi-virtualenv-and-django-ubuntu-1204/ https://virtualenv-chinese-docs.readthedocs.org/en/latest/ https://uwsgi.readthedocs.org/en/latest/tutorials/Django_and_nginx.html http://www.virtualenv.org/en/latest/ 在virtualenv环境下安装 mysqldb的时候遇到几个问题 $ sudo apt-get install libmysqlclient-dev $ sudo apt-get install python-dev   把第一个链接的文章转过来,防止以后不能访问,其他几个都是官方文档,主要还是参考官方文档。 First install required applications.
sudo apt-get install nginx uwsgi uwsgi-plugin-python python-virtualenv
Versions of packages that will be used:
Nginx 1.1.19.1
Uwsgi 1.0.3+dfsg-1ubuntu0.1
Virtualenv 1.7.1.2-1
Django 1.4.1
Virtualenv. I store my project in ~/projects. Now I'm creating python virtual environment for my project and I'm installing Django.
cd ~/projects/
virtualenv eshlox.net
cd eshlox.net
source bin/activate
pip install django
django-admin.py startproject project
Nginx configuration. IMHO, by default, nginx is configured for basic tasks. I won't change this configuration in this entry. Configuration files are stored in /etc/nginx/sites-available. Go to this directory and create a new file.
cd /etc/nginx/sites-available
vim eshlox.net
It's example configuration.
server {
    listen  80;
    server_name eshlox.net www.eshlox.net;
    access_log /var/log/nginx/eshlox.net_access.log;
    error_log /var/log/nginx/eshlox.net_error.log;

    location / {
        uwsgi_pass  unix:///tmp/eshlox.net.sock;
        include     uwsgi_params;
    }

    location /media/  {
        alias /home/eshlox/projects/eshlox.net/project/project/media/;
    }

    location  /static/ {
        alias  /home/eshlox/projects/eshlox.net/project/project/static/;
    }
}
We must create symlink to enable this.
cd /etc/nginx/sites-enabled
ln -s ../sites-available/eshlox.net .
Uwsgi. Like with Nginx.. configuration files are stored in /etc/uwsgi/apps-available. Go to this directory and create a new file.
cd /etc/uwsgi/apps-available
vim eshlox.net.ini
[uwsgi]
vhost = true
plugins = python
socket = /tmp/eshlox.net.sock
master = true
enable-threads = true
processes = 2
wsgi-file = /home/eshlox/projects/eshlox.net/project/project/wsgi.py
virtualenv = /home/eshlox/projects/eshlox.net
chdir = /home/eshlox/projects/eshlox.net/project
touch-reload = /home/eshlox/projects/eshlox.net/project/reload
Enable this.
cd /etc/uwsgi/apps-enabled/
ln -s ../apps-available/eshlox.net.ini .
That's all. Now, run this services.
sudo service nginx start
sudo service uwsgi start
Of course, this is a very basic configuration. Change it according to your needs.
Read more...

git flow使用

查看基本配置信息:git config --list 初始化:git flow init 创建了两个分支,查看: git branch 创建开发分支:git flow feature start agents_test 查看:git branch push 一个 feature branch 到远端:

git flow feature publish agents_test
或 git push origin feature/agents_test

更新
git pull origin feature/agents_test
从远端 branch: git flow feature track agents_test 或 git checkout -b agents_test -t origin/feature/agents_test 合并到 git flow feature finish agents_test

参考:
http://ihower.tw/blog/archives/5140
以下来自:
http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=33263&tid=19584
开始使用git-flow

$ git flow init

新建过程中会为你的各种branch类型起一个名字,推荐使用默认。

master branch

该branch永远处于 production-ready的状态,用于发布,并作为长期分支一直保留,所有产品正式发布出去的内容都来源于该分支,对于每次发布还应有其相对应的tag。

develop branch

一直存在于branch中。

feature-* branch

当有一个新的功能进行开发时,推荐将开发过程放在一个新建的feature分支里。该分支从develop中建立,开发过程中可以共享给团队其它成员,也可以从服务器取到其它成员的feature branch。在功能完成时,将其合并回develop分支并册除该分支。
  • git flow feature [list] [-v] 列出所有的features
  • git flow feature start [-F] <name> [<base>] # 开始一个新的特性分支
    • -F fetch from $ORIGIN before performing local operation
  • git flow feature finish [-rFk] <name|nameprefix> # 结束分支
    • -F fetch from $ORIGIN before performing finish # 在新建之前,先从$ORIGIN获取最新代码。
    • -r rebase instead of merge #使用 rebase 代替默认的 merge,只生成一次commit 记录。
    • -k keep branch after performing finish # 在完成之后仍保留该分支,默认会删除。
  • git flow feature publish <name> # 将该branch发布到origin上与其他人共享。
  • git flow feature track <name> # 从$ORIGIN上获取一个他人共享过的branch,并在本地创建。
  • git flow feature diff [<name|nameprefix>] # feature branch和develop之间所有的差异。
  • git flow feature rebase [-i] [<name|nameprefix>] ?
  • git flow feature checkout [<name|nameprefix>] # 从任一branch切换到指定feature分支
  • git flow feature pull <remote> [<name>] # 获取服务器其它成员的该分支提交。
release branch 在做产品发布时创建的分支类型,在这个分支上做一些配置管理的工作,比如说更改软件版本号之类的。需要注意的是release分支应该从develop分支出来,并且发布结束需要合并回develop和master分支。
  • git flow release [list] [-v] # 列出所有的release分支信息
  • git flow release start [-F] <version> # 新建一个名为<version>的release分支(这里建议使用版本号作为branch名,结束时使用该名字为代码打上tag),新的分支名为release/version.
    • -F fetch from $ORIGIN before performing local operation Start new release named <version>
  • git flow release finish [-Fsumpkn] <version> # 完成该version 的release branch
    • -F fetch from $ORIGIN before performing finish # 在新建之前,先从$ORIGIN获取最新代码。
    • -s sign the release tag cryptographically
    • -u use the given GPG-key for the digital signature (implies -s)
    • -m use the given tag message
    • -p push to $ORIGIN after performing finish # 结束后将代码push到 $ORIGIN
    • -k keep branch after performing finish
    • -n don’t tag this release # 结束时不用给代码打上version的tag
  • git flow release publish <name> # 在$ORIGIN上共享该release 分支
  • git flow release track <name> # 从$ORIGIN上获取一个已被共享的release 分支。
hotfix-* branch 当发布出去的版本有继续fix的问题时,使用hotfix分支类型进行问题修复。需要注意的是hotfix分支应该从master分支出来,并且fix结束需要合并回develop和master分支。
  • git flow hotfix [list] [-v] # 列出所有的hotfix分支
  • git flow hotfix start [-F] <version> [<base>] # 新建一个名为<version>的hotfix分支,分支全名为hotfix/version,可通过参数来选择是基于base而非默认的master。
    • -F fetch from $ORIGIN before performing local operation
  • git flow hotfix finish [-Fsumpkn] <version> # 完成一个hotfix分支
    • -F fetch from $ORIGIN before performing finish
    • -s sign the release tag cryptographically
    • -u use the given GPG-key for the digital signature (implies -s)
    • -m use the given tag message
    • -p push to $ORIGIN after performing finish
    • -k keep branch after performing finish
    • -n don’t tag this release # 不为该branch打上tag
Read more...

ubuntu 解压zip文件 无效编码

用ubuntu解压zip文件后一堆乱码, 1. 通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip (用GBK, GB18030也可以)  
Read more...

ubuntu下vim两个小问题

1.配置文件从windows\下复制换行不一致,报错:E492: 不是编辑器的命令: ^M解决 用vim打开配置文件 :set ff=unix :w 搞定 2.** (gvim:20320): WARNING **: Unable to create Ubuntu Menu Proxy: Timeout was reached 编辑~/.bashrc,添加
function gvim () { (/usr/bin/gvim -f "$@" &) },重启终端。
Read more...

tornado源码学习-web.py

还是从helloworld里,application = tornado.web.Application([(r"/", MainHandler),]),然后看类Application。 参数 transforms用于头信息的定义,列表存储处理类名。ChunkedTransferEncoding,GZipContentEncoding继承自OutputTransform,可以实例化类的时候传入参数transforms,想gzip的启用可以使用setting,例如:settings = {'gzip': True}传入settings参数。 handlers列表,元素为(regexp, request_class)元祖。 settings,还可以设置static_path来标明静态文件访问路径,static_url_prefix标明访问前缀,没有默认设置"/static/"。给添加静态文件访问路由。最后合并参数中 的handlers。这里有一个StaticFileHandler类,等会儿看。 再往下是否载入自动更新模块,通过settings中debug设置。autoreload最最后再看吧。。初始化结束 方法 add_handlers。添加路由协议。983行,self.handlers[-1][0].pattern这里开始没看懂,后来看了re的文档才知道,这里几个变量也容易搞混,不易看懂。self.handlers只能通过,add_handlers进行添加。所以在__init__里面执行add_handlers的时候,self.handlers为空列表。983行 if self.handlers and self.handlers[-1][0].pattern == '.*$':判断只会执行if self.handlers。而当后来进行add_handlers的时候,self.handlers不为空,后面self.handlers[-1][0]类型为正则匹配的类型(我也不知道具体啥名,用type为SRE_Pattern与文档的不一样),可以使用.pattern返回匹配用的字符串进行比较。 这里的功能是为了让‘.*$’匹配放到规则的最下边,这个匹配是域名匹配,路径匹配在handlers,是一个列表,可变对象。在往下就是想handers列表中添加匹配规则,类型URLSpec。具体格式可以打印,先看看类URLSpec。再往下是添加named_handlers,用来通过reverse_url方法,使用name返回匹配的url路径,这个name也是在URLSpec。 URLSpec中self._path, self._group_count的用处现在还不清楚,其他几个上边都有介绍。self._path是把url路径中所有要匹配的替换成%s。self._group_count需要匹配 的数量。reverse方法就是将args带入到self._path。 UIModule类 定义同一类页面的显示。现在还没看到在哪里初始化和使用,Application中_load_ui_methods,_load_ui_modules通过settings设置对应的属性。 _get_host_handlers,__call__在我看完RequestHandler类之后再看,还有web.py其他的类一起。 通过修改helloworl打印一些信息,帮助理解代码:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import os.path

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def main():
    tornado.options.parse_command_line()
    settings = {'gzip': True, 'debug': True,
                'static_path': os.path.join(os.path.dirname(__file__), "static"),
                }
    application = tornado.web.Application([
        (r"/", MainHandler),
    ], **settings)
    print application.transforms
    print repr(application.handlers)
    h = application.handlers[0][0]
    print h.pattern
    for i in application.handlers[0][1]:
        print i.regex.pattern, i.handler_class

    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()
Read more...

vim配置python版编辑器

又装了一个vim小插件,发现以前装过好多,很多也不用。所以把一切装过的都删掉了,重新安装vim,准备写下来传到github上。 1.先装管理插件的vundle。 以前用的pathogen,没有vundle方便。需要安装git,并添加"安装目录/bin"到path环境变量里。用到git里带的curl。 在目录~/.vim (linux) ~\vimfiles(Windows)下创建文件夹\bundle\vundle,复制vundle到该文件夹下。配置文件添加内容来自官网教程。写插件名称的时候注意大小写,不然安装会失败。 2.pydiction。把python_pydiction.vim放到 vim\vimfiles\ftplugin目录下,其他文件放到Vim/vimfiles/ftplugin/pydiction/目录下。 3.ctags。以前好像放到system目录下了,我直接在命令行输出ctags有提示,环境变量也没有修改。 4.taglist,tagbar。启动命令:TlistToggle,tagbar从网上看到介绍,不是太习惯。 5.bufexplorerwinmanager。在BufExplorer窗口中使用”CTRL-N“可以切换到FileExplorer窗口。 6.flake8, vim-flake8,syntastic。语法检测的,以前没有用过。把Python27\Scripts目录添加到环境变量path里了,这样方便一些脚本的调用。 整整折腾了一上午,在Windows下配置的,还缺少一个调试的功能。先把_vimrc文件传到博客。linux版vimrc。  
http://vim.sourceforge.net/scripts/script.php?script_id=850pydic
Read more...

tornado源码学习一--options

下载了tornado 0.1的代码进行学习,之所以选择tornado,是看网上对非阻塞模式评价很高,他也不仅仅是web框架,而且相对django来说代码少多了(django的代码也有看)。选择0.1的原因还是代码相对简单,差别也不大。 查看demos里的helloworld,代码如下:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import logging

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def main():
    tornado.options.parse_command_line()
    application = tornado.web.Application([
        (r"/", MainHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()
从options倒入options和define。先看看官方的描述: 命令行解析模块,来定义使用参数。 例如:上边代码中define("port", default=8888, help="run on the given port", type=int)这句,当年在终端输入helloworld.py --help的时候,将会有“--port                           run on the given port (default 8888)”的提示。 tornado.options.parse_command_line()这一行是对命令行进行解析,格式:("--myoption=myvalue")。也可以是配置文件解析tornado.options.parse_config_file("/etc/server.conf"),配置文件必须是python文件,像: myoption = "myvalue" myotheroption = "myothervalue" 参数指定类型type可以是:datetimes, timedeltas, ints, and floats。 主要说_Options()和_Option() 344行实例化了类_Options,options = _Options.instance(),options现在为空字典,以后将 存储所有选项,通过上边提到的三种方式,添加是只通过define()。 _Option的参数来自define,metavar选择类型的参数,multiple=True会解析多个值,结果列表保存。 这个类里有个有parse()方法,学到很多知识。主要用于解析命令行下的参数,需要将选项对应的类型进行转换,作者使用_parse={type:parse_option_func}.get(type,type)的方法,然后通过_parse(value)进行解析转换参数。没有定义过的解析方法就直接使用type(value)转换了,只能说作者好强大。 代码的最后定义了几个默认设置。0.1的里面有help和logging。 对于options模块里的log代码等下一次总结,剩下的几个函数就很简单了,就不记录了。
Read more...

python处理rss,atom之feedparser

由于Google reader的关闭,这段时间接触rss的东西相对多很多。试过qq的reader,不怎么样,阅读速度没有,是否阅读的标记也没有。其他网站的不想用,又要多注册账户。 找到python的rss处理包feedparser,官方文档很详细。http://pythonhosted.org/feedparser/ >>> import feedparser >>> d = feedparser.parse('http://0x55aa.sinaapp.com/feed') >>> a = d.feed >>> a.title 可以使用keys来查看字典键,可以很清楚的弄懂每一个的意思。官方文档上每一个都有介绍。 >>> d['feed'].keys() rss订阅的文章在d.entries里面是一个列表。 详细使用和高级用法见feedparser官方文档。
Read more...

Previous Page 1 2 3 4 5 6 7 8 9 10 Next Page 最后一页