推送git项目到多个远程仓库

最近开源中国 - 找到您想要的开源项目,分享和交流也推出了git项目托管服务, 想把部分github中的项目同步到git@osc,在网上搜索了一下,找到了一种比较简单的同步办法,方法分享在下面。

首先强烈推荐实用ssh的方式来完成push过程中的认证,这样不用每次都输入用户名和密码,十分方便。具体方式可以参考github的 官方教程GitHub Help

如果已经配置好了ssh验证方式,在开源中国的git托管也可以使用同一个的key,然后打开github项目中中的.git/config文件 在[remote "origin"]节点的原始url下面直接添加开源中国git中对应项目的ssh地址即可,例如:

[remote "origin"]
	url = git@github.com:codepiano/pull-all-git-project.git
	url = git@git.oschina.net:codepiano/pull-all-git-project.git
	fetch = +refs/heads/*:refs/remotes/origin/*

当然,使用命令行也可以直接添加,命令格式如下:

git remote set-url --add origin git@git.oschina.net:codepiano/pull-all-git-project.git

vim zencoding插件的一个bug的跟踪和解决过程

前几天用vim写博客的过程中发现一个bug,当使用<c-y>a自动生成a标签的时候,会丢失href元素, 就跟踪了下那个函数的调用过程。找着bug的原因后,在github上给zencoding的作者发了一个pull request, 不过由于作者想更深层修复缺陷,没有merge,给转成issue了。把具体的跟踪过程和分析记录在这里

<c-y>a是个很好用的命令,比如你准备插入一个a标签,只用输入http://www.vim.org, 然后使用zencoding扩展,会自动生成a标签,插件会联网读取那个网址的title标签, 并使用标签内容作为a标签的显示内容:

<a href="http://www.vim.org">welcome home : vim online</a>

不过我使用的时候遇到一个bug,生成的a标签会丢失href属性,想寻找bug出现的原因就要跟踪代码调用过程。 使用<c-y>a标签的时候在vim状态栏可以看到调用了zencoding#anchorizeURL函数,并传入了一个参数, 值为0。而zencoding插件的初始化操作在plugin/zencoding.vim文件中,顶层函数放在autoload/zencoding.vim中, 具体的处理标签的底层操作逻辑分散放在autoload/zencoding目录中。先从autoload/zencoding.vim入手, 找到了zencoding#anchorizeURL函数,通过阅读代码找到如下逻辑:

" file:autoload/zencoding.vim

" a:flag即为传入的参数,当调用<c-y>a时为0,调用<c-y>A时为1
if a:flag == 0
  " 生成a标签的属性字典
  let a = zencoding#lang#html#parseTag('<a>')
  let a.attr.href = url
  let a.value = '{' . title . '}'
  " 根据属性字典生成html代码
  let expand = zencoding#toString(a, rtype, 0, [])
  " 去除代表光标位置的标志符号
  let expand = substitute(expand, '\${cursor}', '', 'g')
else
  " ...
endif

通过分析上面这段代码,可以知道问题应该处在zencoding#toString函数中,不过通过分析该函数的代码, 发现这个函数只是一个顶层函数,根据上步调用传入的属性字典的name或者snippts属性来决定是调用底层工具函数来生成代码, 还是通过自定义snippts进行扩展。结合传入参数和程序逻辑,在这个功能中,是调用了底层工具函数zencoding#lang#html#toString, 该函数位于autoload/zencoding/lang/html.vim中。函数中有下面这段代码

" file:autoload/zencoding/lang/html.vim

if len(current_name) > 0
  let str .= '<' . current_name
  for attr in zencoding#util#unique(current.attrs_order)
    if !has_key(current.attr, attr)
      continue
    endif
    " ...
  endfor
  " ...
endif

出现href属性丢失的原因是因为current.attrs_order为空,没有'href'属性名字符串, 所以生成的标签也不存在href属性。 也就是说由于程序缺陷,导致属性字典中代表标签属性列表的数组attrs_order为空。 由于我并没有深层次的去读插件的源码,所以不了解这个数组为空的原因, 而autoload/zencoding.vim中的zencoding#anchorizeURL函数只处理a标签的扩展, 所以我直接在顶层函数zencoding#anchorizeURL中给attrs_order中add了一个值'href', 这样可以解决这一个小问题。后来给插件作者发了pull request,说明了bug的原因, 并指出不确定是不是最好的解决方式,插件作者回复说他想从本质上解决这个问题, 把我的pull request转成了issue。一开始我以为作者会去解决attrs_order数组为空的问题, 不过pull最新的代码,发现作者也没去修改attrs_order数组,而是在底层的工具函数上打了个补丁, 修改后的代码如下

" file:autoload/zencoding/lang/html.vim

if len(current_name) > 0
  let str .= '<' . current_name
  " 打了个keys(current.attr)的补丁,补全了属性
  for attr in zencoding#util#unique(current.attrs_order + keys(current.attr))
    let val = current.attr[attr]
    " ...
  endfor
  " ...
endif

关于这次的bug修改,让我想起看过的伞哥 @田春冰河 的一条微博说过的一种情况, 微博找不到了,大意是说:一个工具模块的代码缺陷A,导致不同的功能中出现bug的并集U, 测试人员通过测试发现其中一个子集u,然后开发人员修复子集u中的bug, 而真正好的解决方式是通过bug集u找到问题的源头,即缺陷A,从而修复整个bug集U。 这次的情况也类似,我只修复了a标签生成这一个bug,作者修改底层模块后也修复了潜在的其他bug


生成表格边框的vim插件

vim插件,惟一用途是在文本文件中来展示表格,使用字符来模拟表格的边框。会破坏原始数据,不便于复制, 请谨慎使用。由于字符的展示方式与字体有关,可能某些字体下边框不能完美的对齐。 项目地址:codepiano/TableKnight · GitHub

插件会根据分隔符自动分割选定的文本行,然后插入边框字符。例如:下面的字符

1|2
|1|2|||3
1|2|3|4|5
会生成:
+===========+
|1|2| | | | |
|-+-+-+-+-+-|
| |1|2| | |3|
|-+-+-+-+-+-|
|1|2|3|4|5| |
+===========+

插件提供了边框和分割符的自定义机制,具体请参考README


更新路径下所有git项目和项目中的子模块

在给定目录的所有子文件夹下执行git pull,如果你签出的项目都在一个或几个目录下, 例如,你使用git clone命令签出了4个项目到F:\GIT目录下:

F:\GIT

├─JQuerySourceCode

├─pull-all-git-project

├─RapidValidation

└─TableKnight

可以在脚本的配置变量中添加路径:F:\GIT,执行脚本就可以依次在每个目录中进行下列操作,先更新项目, 如果项目包含子模块再更新所有子模块。注意:更新默认的分支都是主分支

# 下面两个命令在项目中执行
git pull origin master
git submodule foreach pull git origin master

脚本提供了Windows版的bat文件和Linux下的Bash文件,两个脚本行为一样,由于脚本语言的差异, 配置方式有一些不同,具体请参考README。如果发现子模块无法更新,请手动在项目中执行下面两个命令, 然后再进行尝试:

git submodule init
git submodule update

—  原创作品许可 — 署名-非商业性使用-禁止演绎 3.0 未本地化版本 — CC BY-NC-ND 3.0   —