TortoiseGit 与 Putty 配置冲突导致 Server refuse our key

TortoiseGit 原本用得好好的,一日安装了 Putty 后,问题出现了。。

在进行 git 操作时提示:

TortoisePLink fatal error
Disconnected: no supported authentication methods available
(server sent publickey)

TortoiseGit 版本信息:

TortoiseGit 1.8.3.0 (C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe)
git version 1.8.1.msysgit.1 (C:\Program Files (x86)\Git\bin)

因为 TortoiseGit 调用了由 Putty 修改而来的 TortoisePLink,因此 Putty 的配置将会影响 TortoiseGit。

解决方法,删除注册表中的以下节点即可:

HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Default%20Settings

— EOF —

单机进行Github多账户多项目管理

在 Github 创建了多个仓库,并为每个仓库使用了独立的 deploy key,结果在进行 git push 操作时,提示没有权限。错误信息类似:

ERROR: Permission to quyun/php-backend.git denied to quyun/aliyun-api-tools

官方的帮助中有提到这个错误:

https://help.github.com/articles/error-permission-to-user-repo-denied-to-user-other-repo

不过对于许多应用场景,使用一个全局的 key 并不能满足要求。

简单分析下,我们可以发现 ssh 客户端是通过类似:

git@github.com:quyun/aliyun-api-tools.git

这样的 git 地址中的 user 和 host 来识别使用哪个本地私钥的。

很明显,如果 user 和 host 始终为 git 和 github.com,那么就只能使用一个私钥。

指定私钥的方式也很简单,编辑 ~/.ssh/config,添加类似如下配置即可:

Host php-backend.github.quyun.net
IdentityFile ~/.ssh/github-php-backend
User git

Host aliyun-api-tools.github.quyun.net
IdentityFile ~/.ssh/github-aliyun-api-tools
User git

配置格式很简单,不多做解释。

光是这样指定当然不够,你会发现我这里的 host 已经不是 github.com 了。
我为每个仓库使用了自己的 host,每个 host 的域名做 CNAME 解析到 github.com,这样 ssh 在连接时就可以区别不同的仓库了。

来测试下:

# ssh -T git@php-backend.github.quyun.net
Hi quyun/php-backend! You’ve successfully authenticated, but GitHub does not provide shell access.

# ssh -T git@aliyun-api-utils.github.quyun.net
Hi quyun/aliyun-api-tools! You’ve successfully authenticated, but GitHub does not provide shell access.

可以看到 ssh 已经能够根据不同 host 使用不同私钥了。

最后,将你的 git 仓库地址中的 host 改为新设置的 host 即可,如上面的:

git@github.com:quyun/aliyun-api-tools.git

改为:

git@aliyun-api-tools.github.quyun.net:quyun/aliyun-api-tools.git

在 windows 下也会出现这个问题,用同样的方式解决即可!

xdelta: Windows 下大文件比较(diff/patch)工具

Unix/Linux 系统下的 diff 和 patch 工具真的非常好用!
但是在 Windows 下似乎没有很好的替代工具(装 MinGW 方式除外)。

如果只是比较小文件,其实 Windows 下不缺工具,Beyond Compare、DiffMerge、UltraCompare,Tortoise SVN 也带有一个文件比对工具。
但是如果要对比两个 2G 的文件,90% 的工具都要废了,貌似他们都喜欢把要比对的文件完全加载到内存中,然后做可视化的比对。

最后找到的 xdelta 这个工具可以满足我的要求,项目地址:
http://code.google.com/p/xdelta/

命令行使用帮助:

E:\soft>xdelta3.0z.x86-32.exe –help
Xdelta version 3.0z, Copyright (C) 2007, 2008, 2009, 2010, Joshua MacDonald
Xdelta comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; see “COPYING” for details.
usage: xdelta3 [command/options] [input [output]]
make patch:

xdelta3.exe -e -s old_file new_file delta_file

apply patch:

xdelta3.exe -d -s old_file delta_file decoded_new_file

special command names:
config prints xdelta3 configuration
decode decompress the input
encode compress the input
test run the builtin tests
special commands for VCDIFF inputs:
printdelta print information about the entire delta
printhdr print information about the first window
printhdrs print information about all windows
recode encode with new application/secondary settings
merge merge VCDIFF inputs (see below)
merge patches:

xdelta3 merge -m 1.vcdiff -m 2.vcdiff 3.vcdiff merged.vcdiff

standard options:
-0 .. -9 compression level
-c use stdout
-d decompress
-e compress
-f force (overwrite, ignore trailing garbage)
-h show help
-q be quiet
-v be verbose (max 2)
-V show version
memory options:
-B bytes source window size
-W bytes input window size
-P size compression duplicates window
-I size instruction buffer size (0 = unlimited)
compression options:
-s source source file to copy from (if any)
-S [djw|fgk] enable/disable secondary compression
-N disable small string-matching compression
-D disable external decompression (encode/decode)
-R disable external recompression (decode)
-n disable checksum (encode/decode)
-C soft config (encode, undocumented)
-A [apphead] disable/provide application header (encode)
-J disable output (check/compute only)
-T use alternate code table (test)
-m arguments for “merge”
the XDELTA environment variable may contain extra args:
XDELTA=”-s source-x.y.tar.gz” \
tar –use-compress-program=xdelta3 \
-cf target-x.z.tar.gz.vcdiff target-x.y

帮助里写得很详细了,我就不再作解释。

— EOF —

Linux 下的多线程下载工具

最先用的是 Axelhttp://axel.alioth.debian.org/),功能还可以,不过下载文件最多支持到 2GB,再大的文件就不能下载了,真变态!

接着试用了下 agethttp://www.enderunix.org/aget/),可惜在服务器上不知道什么原因,无法使用!

最后选择用 aria2http://aria2.sourceforge.net/),很不错,同时支持 HTTP/HTTPS/FTP/BitTorrent。

用法(10个线程下载):
#aria2c -j10 http://www.bigbig.com/big.zip

— EOF —

批量修改 SVN 库中的用户名

Redmine 提供了整合 SVN 的功能,整合后可以在 Redmine 中直接查看 SVN 的修订记录。当 SVN 修订记录中的修改者名称与 Redmine 系统中的用户名一致时,Redmine 还会自动将用户名解析为真实姓名。

这个功能非常好用,不过因为有些用户的 Redmine 用户名和 SVN 用户名不一致,导致帐号无法关联。所以才有了我批量修改 SVN 库中用户名的需求。

修改某个 SVN 修订记录的用户名,可以使用以下 SVN 命令:

svn propset --revprop -r $rev svn:author $new_author $svn_url

不过 SVN 库默认是不允许修改用户名的,所以需要在版本库目录下的 hooks/ 目录中新建一个钩子文件:pre-revprop-change,这个文件可以直接从pre-revprop-change.tmpl复制,内容修改如下:

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:author" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

保存后将权限修改为 755。

当然,修订记录可能很多,我们不可能一条条去执行命令修改,所以需要写个脚本去批量修改。不过我发现 TortoiseSVN 就有这个功能,查看 log 日志,然后搜索要修改的的用户名相关的修订记录,全选,右键,Edit Author,填入新用户名,确认后即可完成批量修改了 😛

Redmine 似乎会对 SVN 修订记录进行缓存,所以改完用户名后,回到 Redmine 上,把原有的 SVN 删除掉,重新新建就可以了。

— EOF —