Git起步

我的学习路径:git basic, http webdav, git-svn, gitosis, gitweb,下面是一些学习记录。

http webdav方式访问

ubuntu下安装非常简单,用apt装上git-core包即可。git仓库的外部访问,首先就是最熟悉的用http协议走apache上的webdav服务,方便啊。git自身的身份认证和权限分配弱了一些,不过可以借助apache实现用户分配,passwd文件直接用svn的也没问题。apache配置示例如下:

Alias /git "/big2/git"
<Location /git/test.git>
    DAV on
    AuthType Basic
    AuthName "Test git freely"
    AuthUserFile "/big2/svn/svnpasswd"
    #Require user Fwolf
    Require valid-user
</Location>

但这样远不如使用ssh/git协议访问仓库速度快和稳定,但更适合公开/对外发布。另外和svn的webdav方式不同,git webdav是一种dumb transport,不仅慢而且比较傻,只能进行简单的存、取文件操作,所以hooks是不起作用的(很多文章中说的提交后要在hooks/post-update里启用git-update-server-info,指的是git/ssh方式更新后,为webdav对外发布作准备)不会自动进行和git相关的其它处理。

最好用的还是gitosis,后面会提到。有些内容先以webdav方式下来记,使用的时候根据不同的方式转换用户角色即可。

创建服务端的仓库

其实和svn创建仓库也是比较类似的,找一空目录,比如叫test.git,执行:

$ git --bare init
$ sudo chown www-data:www-data * -R

客户端就可以下载了,但还有些问题:

$ git clone https://domain.tld/git/test.git gittest
Initialized empty Git repository in /home/fwolf/dev/gittest/.git/

error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt

首先遇到的是证书错误,git使用curl,所以证书的处理和svn也不一样,用firefox浏览git网站,在Page Info->View Certificate->Details中把网站的根证书(Issued By/root)导出为一个pem文件,然后将这个pem文件的内容添加到/etc/ssl/certs/ca-certificates.crt的末尾就可以了。接着遇到的是401身份验证错误:

error: The requested URL returned error: 401

git不像svn会自动提示用户名/密码,因为它用的是webdav的原生功能,所以需要在$HOME下创建文件.netrc(记得将权限修改为600):

machine domain.tld
login Fwolf
password your_passwd

最后,还是仓库本身不完善的问题:

warning: remote HEAD refers to nonexistent ref, unable to checkout.

在服务器上仓库目录,执行$ git update-server-info并再次chown到www-data就行了。初次push得指明服务器上的origin对应本地master分支/branch:

$ git push origin master

而下载之前,还要设置下载后放到那个分支、与哪个分支的现有内容进行merge:

$ git config branch.master.remote origin
$ git config branch.master.merge master
$ git pull  # 注意如果服务器是新建的空repo,得随便push点东西才好pull

gitosis

还是通过apt安装,gitosis使用SSH key来认证用户,但用户不需要在主机上开账号,而是公用主机上的一个受限账号。首先创建这个账号(名称可变):

sudo adduser \
    --system \
    --shell /bin/sh \
    --gecos 'git user' \
    --group \
    --disabled-password \
    --home /big2/gitosis \
    git

然后生成自己用户的ssh密钥,可以在git用户的$HOME下操作:

ssh-keygen -t rsa

不要密码,可以起名叫git_rsa[.pub],然后用公钥来初始化gitosis的目录:

$ sudo -H -u git gitosis-init < /home/fwolf/.ssh/git_rsa.pub 
Initialized empty Git repository in /big2/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /big2/gitosis/repositories/gitosis-admin.git/

可以看出gitosis自己也在用git仓库的形式存储东西,传递公钥进去是为了配置自动登录,将公钥写入git用户的$HOME/.ssh/authorized_keys。接下来就启用gitosis仓库的post-update hook:

$ sudo chmod 755 repositories/gitosis-admin.git/hooks/post-update

其实用apt安装的gitosis,这个post-update早已指向其它文件并具有x属性了。

一点提示:把gitosis的repositories和自己原先的git repo目录弄到一起,以后方便,因为gitosis自己的管理也是要通过git来提交的,在客户端先修改$home/.ssh/config

Host git.domain.tld
Compression yes
IdentityFile ~/.ssh/git_rsa # 注意这个是私钥,不是pub公钥

然后从客户端clone gitosis的配置文档:

$ git clone git@git.domain.tld:gitosis-admin.git

注意实际上这个gitosis-admin.git应该是在git用户的$HOME下的repositories目录下,但这么写才能下载。clone得到一个配置文件gitosis.conf和目录keydir/,对了,git配置的修改、上传也是通过git提交,并且由于刚才设置的post-update hook,立即生效。所以现在就能够远程修改、提交配置了。下面是一份比较完整的自说明的gitosis.conf

# example: http://eagain.net/gitweb/?p=gitosis.git;a=blob;f=example.conf
[gitosis]

## Allow gitweb to show all known repositories. If you want gitweb,
## you need either this or a [repo foo] section for each repository
## you want visible in gitweb.
gitweb = no

[group gitosis-admin]
writable = gitosis-admin
# member is key file name, without (.pub)
members = fwolf

# user group
[group all]
# members = jdoe alice bob @anothergroup
members = fwolf
# this user group is writeable to ... repo, eg: test.git.
# writeable = foo bar baz/thud
writeable = test
#readonly = somerepo

[repo test]
## Allow gitweb to show this repository.
gitweb = yes
## Oneline description of the project, mostly for gitweb.
description = Fwolf's test git repository
## Owner of this repository. Used in gitweb list of projects.
owner = Fwolf
## Allow git-daemon to publish this repository.
#daemon = yes
daemon = no

平时就是为其它用户添加SSH key,然后用git@git.domain.tld:repo.git来连接服务器,gitosis会自动比对服务器上的pub key,判断出用户是谁。

gitweb

用apt安装,得到/usr/lib/cgi-bin/gitweb.cgi,由于cgi-bin已经由ubuntu设置好了,apache只要设置一下资源文件路径即可:

Alias /gitweb "/usr/share/gitweb"

然后修改/etc/gitweb.conf

# path to git projects (<project>.git)
$projectroot = "/big2/git";

$site_name = "Fwolf's Git Repositories";
@git_base_url_list = ("ssh://git\@git.domain.tld");

# directory to use for temp files
$git_temp = "/tmp";

# target of the home link on top of all pages
#$home_link = $my_uri || "/";

# html text to include at home page
$home_text = "indextext.html";

# file with project list; by default, simply scan the projectroot dir.
$projects_list = "/big2/gitosis/gitosis/projects.list";
# Avoid use guess repo's address and edit url manually
$strict_export = 1;

# stylesheet to use
$stylesheet = "/gitweb/gitweb.css";
# logo to use
$logo = "/gitweb/git-logo.png";
# the 'favicon'
$favicon = "/gitweb/git-favicon.png";

重启apache后就能够用http://git.domain.tld/cgi-bin/gitweb.cgi访问了。

git-svn混用

首先还要安装git-svn包,git和svn混用的好处就是既可以用git进行本地提交和灵活的分支,又能够用svn实现集中管理和分发,缺点我想可能就是svn的revision号在git里没有了,另外git有些太灵活,不是很好入门。

首先导入svn的现有项目到一个空目录:

$ git svn clone --username your-name -s https://domain.tld/svn/repo
# older versions of git: replace "-s" with "-Ttrunk -bbranches -ttags"

就这么简单,很多工作git-svn都代劳了,剩下就当正常的git目录使用即可,比如为他们指定git仓库的位置,并下载文件:

$ git config remote.origin.url https://domain.tld/git/test.git
$ git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
$ git checkout master   #回到master分支
$ git pull

向svn仓库提交:

$ git svn dcommit

从svn仓库接受更新:

$ git svn rebase

在git-svn的使用中还发现,如果在机器A上使用git-svn,但是在另外一台机器B上用纯git进行了push,那么B上的commit是不会被git-svn认出来并dcommit的,只有pull下来,然后再假commit一下才能让git-svn看到。

仓库地址变更

服务器上直接修改仓库目录名和apache设置,客户端上:

$ git config remote.origin.url https://domain.tld/git/testnew.git
$ git pull  # 这个必须要做,不然不能push
Merge made by recursive.
$ git push

git-svn方式下变更svn的地址

首先要修改所有commit中的地址:

$ git filter-branch --msg-filter 'sed "s/domain_old\/trunk/domain_new\/trunk/g"' $(cat .git/packed-refs | awk '// {print $2}' | grep -v 'pack-refs')

然后删掉缓存,修改地址,重新下载:

$ rm -rf .git/svn
# 编辑`.git/config`修改`[svn-remote "svn"]`的url。
$ git svn rebase (--all)

我还曾经遇到过这样的错误:

$ git svn rebase
Unable to determine upstream SVN information from working tree history

不太好处理,这里有些参考信息,我是在一个repo里pull另外一个仓库的内容了,照下面方式处理也不管用:

  • 从svn里重新clone出一份
  • git里创建个branch保存一下
  • git连接上服务器,pull
  • git checkout 到刚才创建的branch
  • git merge –no-ff master
  • git svn rebase/dcommit

效果不好,不仅产生大量的conflict,而且还是只能在新创建的branch上rebase/dcommit。大概是出现了两“棵”树,怎么也捏不到一起,最后只好重建仓库。

其它使用技巧/tips

  • 回上个版本 $ git reset --hard HEAD^
  • 得到一个文件5个版本以前的状态 $ git checkout HEAD~5 foo.c
  • 由于git是分布式的scm,所以$Id被彻底消灭掉了。
  • 不像svn,git能够记录文件的执行属性。
  • 为显示加上颜色 $ git config color.(branch|diff|interactive|status) auto,或者$ git config color.ui true
  • hooks不算仓库的内容,每个repo的hooks可以不同。
  • 当心svn的hooks,如果git里已经commit,却因为svn的hooks使git-svn的dcommit失败,很麻烦。
  • .gitignore里可以用config.php忽略文件,并且用!mt/config.php指明个别文件还是要归入scm管理的。
  • 从现有的客户端目录中生成仓库目录 $ git clone --bare dev_dir repo_dir 每个客户端都是一个完整备份,方便。
  • 用于ignore文件,.gitignore是要提交的版本,.git/info/exclude则是只在你本地生效的版本,不提交。
  • 仅给ssh登录的开发者push/pull的访问权限,将其shell设置为/usr/bin/git-shell(未测试).
  • info/allowed-users可以控制用户对branch/tag的访问权限(未测试)。
  • git --bare init --shared=group可以让仓库被同group的用户共享,不过有gitosis就不用这个了,我没测试。

参考

Update @ 2009-03-27

使用git-svn的时候,有时候会出现git和svn树不太同步的情况,在进行svn rebase的时候总是重新merge文件,这种现象多是由于以前没有正确rebase引起的,而rebase不成功的一种原因就是git的fast forward。简单理解一下,git是按照树形结构排下来的,如果遇到前后两个节点被判定为“重复”的,git就聪明的作了个fast forward,直接使用后者了。这在git里没事,因为都是一颗树,而对于svn就不行了,它还记录着要从前面那个节点开始呢,所以合并的时候就出现了两个源头的情况,自然会产生问题。所以大体上向svn更新的顺序应该是这样的:

  • git push # git更新
  • git pull –no-ff # 此处的–no-ff最为重要,平时可以不用,这里要用
  • git svn rebase # 准备提交到svn之前先和当前的树合并
  • git svn dcommit
  • git pull –no-ff
  • # 后面就是检查了,前面操作正常的话不会产生新的有效更新了
  • git push
  • git svn dcommit
  • git svn rebase
  • git pull
  • git push

附一张比较典型的出错后来回折腾的结果图: git-svn rebase dcommit error

参考 @ 2009-03-29

有了git track以后,新建要和服务器同步的branch:

$ git branch fwolf
Branch fwolf set up to track local branch refs/heads/master.

$ git track fwolf origin
tracking origin/fwolf

$ git checkout fwolf
Switched to branch "fwolf"

$ git push origin fwolf
Total 0 (delta 0), reused 0 (delta 0)
To git@domain.tld:repo.git
 * [new branch]      fwolf -> fwolf

而从其它客户端下载这个branch就简单多了:

$ git branch --track fwolf origin/fwolf
Branch fwolf set up to track remote branch refs/remotes/origin/fwolf.

掌握原理,不用git track也一样可以实现的。

Update @ 2009-04-18

MediaTemple使用的是CentOS,安装git也很简单:

$ rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm
$ rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/yum-3.2.19-18.el5.centos.noarch.rpm http://mirror.centos.org/centos/5/os/i386/CentOS/yum-fastestmirror-1.1.16-13.el5.centos.noarch.rpm  # 版本号可能会有变化
$ rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-2.noarch.rpm
$ yum -y update
$ yum install git

参考:

Update @ 2009-04-27

升级到ubuntu 9.04 jaunty后,客户端push时会遇到错误:

$ git push
/usr/bin/gitosis-serve:5: UserWarning: Unbuilt egg for ClientCookie [unknown version] (/usr/lib/python2.6/dist-packages)
  from pkg_resources import load_entry_point
Traceback (most recent call last):
  File "/usr/bin/gitosis-serve", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 2562, in <module>  
    working_set.require(__requires__)
  File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 626, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 524, in resolve
    raise DistributionNotFound(req)  # XXX put more info here
pkg_resources.DistributionNotFound: gitosis==0.2
fatal: The remote end hung up unexpectedly

半天查不出原因,只是怀疑和python的版本有关系(2.5/2.6),因为gitosis在debian包中的文件,显示应该是对应python 2.5的,不过,试着自己用python(2.6)重新下载安装了一遍gitosis,好了:

	$ git clone git://eagain.net/gitosis
	$ cd gitosis
	$ sudo python setup.py install

不懂Python太吃亏了呀。另外aptitude reinstall gitosis是没用的。

Update @ 2009-05-15

Tsung那里学来一招,可以更改 Git 默认的信息存放目录 .git :

修改 Shell 變數 GIT_DIR => "export GIT_DIR=.test"

Update @ 2010-08-03

升级到 Ubuntu 10.04 Lucid 以后,gitosis 自带的 hook 文件 post-update,就是修改权限等等 commit 后,自动出发 gitosis 更新相关配置的钩子,原来 ln 到的 /usr/share/python-support/gitosis/gitosis-0.2-py2.5.egg/gitosis/templates/admin/hooks/post-update 无效了,更换成 /usr/share/pyshared/gitosis/templates/admin/hooks/post-update 就可以了,参见Bug报告。挺让人无语的bug,我折腾了半天还以为是权限设置出了什么问题呢。

[Ubuntu]使用点滴

注:本文按照体验时间倒序排列,最后更新时间:2009-01-08。

fstab配置参数中如果要使用空格怎么办?

用\040替代空格即可。

访问windows共享打印机时windows端容易忘记的设置

在组策略管理gpedit.msc中:

  • “用户权利指派”中,“从网络访问此计算机”中加入guest帐户,“拒绝从网络访问这台计算机”中删除guest帐户
  • “网络访问:本地账户的共享和安全模式”设为“经典—本地用户以自己的身份验证”
  • 禁用“账户:使用空白密码的本地账号只允许进行控制台登录”

关机后无法自动切断电源

如果在dmesg中有如下内容:

[    0.000000] ACPI: no DMI BIOS year, acpi=force is required to enable ACPI

那么在/boot/grub/menu.lst中对应启动内核的kernel项后面添加acpi=force即可,比如:

kernel      /boot/vmlinuz-2.6.22-14-generic root=UUID=7fa1d627-0068-44ec-9beb-1701f1544e88 ro quiet splash acpi=force

Downloader for X启动时没响应

如果在shell中启动,能看到错误信息:

~$ d4x
mcop warning: user defined signal handler found for SIG_PIPE, overriding

解决方法,在配置文件~/.ntrc_2/config中,把enable_sounds 1中的1改为0即可,参考

打开网络设定network-admin/Network Settings时错误

提示:

The entered password is invalid Check that you typed it correctly and that you haven't activated the "caps lock" key although correct passwd

总说密码不对,但你输入的密码肯定没有问题,其实这是一个bug(参见Debian > gnome-system-tools (2.18.1-1) changelog),解决方法,安装或者重装gnome-system-tools即可,另外两个可疑的包就是libnet-dbus-perlsystem-tools-backends

ATI显卡,fglrx驱动加载成功,但direct rendering无法打开

部分错误信息:

$ LIBGL_DEBUG=verbose glxinfo
name of display: :0.0
...
libGL: OpenDriver: trying /usr/lib/dri/radeon_dri.so
libGL error: dlopen /usr/lib/dri/radeon_dri.so failed (/usr/lib/dri/radeon_dri.so: undefined symbol: _glapi_get_dispatch)

卸载xorg-driver-fglrx,问题解决。参考

升级到7.10之后,系统无法启动,并且控制台一直刷屏提示:

[ 227.338011] device-mapper: table: 254:1: linear: dm-linear: Device lookup failed

这时evms和新版的内核冲突,如果能用旧内核启动,进入系统aptitude删除evms即可;如果坚持用现有系统启动,那么将就着敲回车,会看到提示输入root密码进入维护,进去之后,删除evmsevms_activate两个文件,重启,刷屏错误提示就消失了,正常进入系统之后,再删除evms。参考device-mapper: table: 245:1: linear: dm-linear: device lookup failed[Bug 115616] Re: Device-mapper errors: dm-linear, lookup failed

合上笔记本屏幕时系统待机

修改/etc/acpi/events/lidbtn,把其中的action=/etc/acpi/lid.sh改成action/etc/acpi/sleep.sh sleep,参考在Thinkpad上安装Ubuntu笔记

Xfce桌面环境下firefox字体太小的问题

编辑~/.config/xfce4/Xft.xrdb,增加一行Xft.dpi: 96,指定桌面dpi为96就可以了,不用再修改~/.mozilla/firefox/Fwolf/chrome/userChrome.css,添加* {font-size: 12px !important;},在Xfce设置Window ManagerUser Interface Perferences中也不用把字体更改为12号,用默认的10号字就行了,效果完美()。

更新软件到指定版本,或者说是降级

sudo aptitude install subversion=1.4.2dfsg1-2

samba服务器端字符集设置及大于4G的文件

有时候客户端(无论是windows还是linux)连接samba会出现看不到中文的情况,除了设置客户端iocharset=utf8,codepage=cp936之外,服务器端还要在smb.conf 中的[global]段加上:

display charset = UTF-8
unix charset = UTF-8
dos charset = cp936

想通过samba访问大于4G的文件,挂载时需要加上lfs参数,比如下面这个用在fstab中的例子:

# In fstab
//server/fwolf    /path/to/local/mount/point smbfs username=fwolf%password,iocharset=utf8,codepage=cp936,dmask=700,fmask=600,uid=1000,gid=1000,lfs       0 0

查询网卡的实际连接速率

$ dmesg |grep eth0

[100167.238859] tg3: eth0: Link is down.
[100185.192321] tg3: eth0: Link is up at 1000 Mbps, full duplex.
[100185.192330] tg3: eth0: Flow control is on for TX and on for RX.

挂载iso文件之后,里面的中文文件名显示为问号 在mount选项中增加字符集选项即可:

mount somefile.iso /media/cdrom -o loop,iocharset=utf8

codepage选项就不用加了,加上了反而出错。

格式化分区后uuid变了,到哪里找去? 刚刚知道reiserfs的作者遇到了严重的法律问题,就把一个空分区从reiserfs重新又格式化成ext3了,但格式化之后无法重新mount了,提示uuid不对。不要紧,用vol_id /dev/sda6查询出设备的uuid,修改fstab,再重新mount就可以了。

使用正则表达式批量文件改名 rename -v ‘s/(\d+)$/$1.pdf/’ 071

dos和unix文件格式的转换 原来在包sysutils中,现在挪到tofrodos中来了,安装以后todos [file]是转换为dos回车换行格式,fromdos [file]是转换为unix回车换行格式。另外vi中^M就是“\r”。

类似“^[”这样的escape转换字符可以用Ctrl-V+ESC来录入。

Nvidia显卡终极安装指南(英文) 同样还不要忘记nvidia-glx-config enable也可以替代nvidia-xconfig命令,同时这里还有一个自动设置脚本(未测试),gforce2以前的老卡,可能还要在xorg.conf中添加:

Section “Extensions” Option “Composite” “Disable” EndSection

不然glx没法用,提示错误:

Xlib: extension “GLX” missing on display “:0.0”. Error: couldn’t get an RGB, Double-buffered visual

参考

mplayer在播放影片时如何截图? 如果使用其他截图软件,比如scrot,只能得到一张纯蓝色的图,取不到真正的图像,不过DarkToy为我们琢磨出了十分简便的方法: 在~/.mplayer/config中添加一句: vf=screenshot 这是告诉mplayer启动的使用启用这个参数,然后再在~/.mplayer/input.conf中设置一个未冲突的快捷键绑定(这个文件一般是不存在的,新建一个即可): c screenshot 0 那么在播放影片是按c键就可以截图了,据说如果后面那个数字0改为1,还会连续截图。

Java程序中的中文都是方块,怎么办? cd /usr/lib/j2sdk1.5-sun/jre/lib/fonts (也许根据jre版本不同位置略微变化) sudo mkdir fallback (不知道改个名字是否还能行) cd fallback sudo ln -s /usr/share/fonts/VeraSansYuanTi/VeraSansYuanTi-Regular.ttf (也可以是别的字体文件,ln -s不指定符号链接文件名的话,会自动命名为和所链接的文件名相同的文件) sudo mkfontdir (好像如果链接的字体文件已经正确配置在系统中了,后面这两步可以省略) sudo mkfontscale 参考:Ubuntu 5.10中文环境下安装FreeMind简介

iso文件与光盘刻录 创建ISO文件: cp /dev/cdrom image.iso 装载ISO文件: mount -o loop image.iso /mnt/cdrom 注意这种挂载的方法和挂载其他分区一样,存在字符集编码的问题,如果是要刻录光盘的话,还是使用k3b好了,这是个kde下的程序,不过安装一大堆包之后,也可以在gnome下运行。

光盘上中文文件名乱码的解决方法 编辑/etc/fatab,修改cdrom挂载的那一行,添加黑体部分的内容如下: /dev/cdrom /media/cdrom0 udf,iso9660 iocharset=utf8,user,noauto 0 0

nvidia卡提示glx错误怎么办? 错误信息:

Xlib: extension “GLX” missing on display “:0.0”. glxgears: Error: couldn’t get an RGB, Double-buffered visual.

原因在这里说了,部分nvidia老式显卡不被新的驱动支持,这种情况下要安装nvidia-glx-legacy,然后再nvidia-glx-config enable、重启X应该就可以了,这些老卡有:

NOTES SECTION * Below are the legacy GPUs that are no longer supported in the unified driver. These GPUs will continue to be maintained through the special legacy NVIDIA GPU driver releases. NVIDIA chip name Device PCI ID ——————————- ——————————- RIVA TNT 0x0020 RIVA TNT2/TNT2 Pro 0x0028 RIVA TNT2 Ultra 0x0029 Vanta/Vanta LT 0x002C RIVA TNT2 Model 64/Model 64 Pro 0x002D Aladdin TNT2 0x00A0 GeForce 256 0x0100 GeForce DDR 0x0101 Quadro 0x0103 GeForce2 GTS/GeForce2 Pro 0x0150 GeForce2 Ti 0x0151 GeForce2 Ultra 0x0152 Quadro2 Pro 0x0153 —————————————————————-

参考

如果播放flash没有声音怎么办? 试试这样:“sudo ln -fs /usr/lib/libesd.so.0 /usr/lib/libesd.so.1”,参考。 另一说为修改/etc/firefox/firefoxrc,加入(或修改)FIREFOX_DSP=”aoss”,aoss要视你的dsp而定,如esddsp,artsdsp,aoss(aoss要求已经安装了alsa-oss),也可以试一下auto,反正不能是none,参考

如何配置dns缓存实现上网加速 freebsd下可以用djbdns,ubuntu下我们可以用dnsmasq:“apt-get install dnsmasq”,然后编辑/etc/resolv.conf文件(dns服务器列表就保存在这里),在最前面加上一行:“nameserver 127.0.0.1”,搞定。注意网上有的文章把resolv.conf笔误为esolv.conf了,包括我参考的这篇hp笔记本上安装Ubuntu。dnsmasq设置完以后能看到本机监听53端口就说明成功了。

网页中的flash不能正确显示中文如何解决?

以前在breezy里,默认的中文GB字体是AR PL SungtiL GB, AR PL KaitiM GB,flash还能够显示出中文(尽管受到日文字体的干扰,字体混用在一起,不好看),到了dapper,默认中文字体变成了AR PL ShanHeiSun Uni(uming),flashplayer(7.23),找不到这个字体,所以中文根本显示不出来。据说flashplayer要出9.0了,到时候可能可以自动认出新的字体,不过在没出之前,大家可以用我的办法让它正确显示中文GB字体,原理就是把新字体伪装成flashplayer可以认出的字体。 cd /etc/defoma/hints sudo cp ttf-arphic-uming.hints custom.hints 编辑custom.hints文件,找到: X-Family = AR_PL_ShanHeiSun_Uni 一行,改成: X-Family = AR_PL_SungtiL_GB 然后运行: sudo defoma-font register-all custom.hints 以注册新的(假)字体,为避免日文字体的干扰,可以把日文字体反注册掉(可选): sudo defoma-font unregister-all ttf-kochi* 然后运行: sudo defoma-reconfigure 最后重启X,大功告成!

参考地址 讓 Firefox 的 Flash Player 能完整顯示中文!(非常详细的解释) {update @ 2006-9-2 现在由于ubuntu中删除了有版权问题的mkcfm(见bug report:mkcfm is needed for some fonts, but lacks an appropriate license for Ubuntu),这种方法不行了,在进行最后defoma-reconfigure的时候会出错:

Updating category cid.. Updating category cmap.. Can’t exec “/usr/bin/mkcfm”: No such file or directory at /var/lib/defoma/scripts/x-ttcidfont-conf.defoma line 791.

这种情况下就只能老老实实的把字体装上了: 查看flashplayer都支持那些中文字体: strings /usr/lib/mozilla-firefox/plugins/libflashplayer.so | grep ‘AR PL’ AR PL KaitiM GB AR PL SungtiL GB AR PL KaitiM Big5 AR PL Mingti2L Big5 看看源中可供安装的中文字体都有哪些: aptitude search arphic 安装其中简体的两个: apt-get install ttf-arphic-gbsn00lp ttf-arphic-gkai00mp 然后重启X。 但这样好像还是不行,我也没有办法了。 }

解决glxgears不显示帧数的问题 glxgears -printfps or glxgears -iacknowledgethatthistoolisnotabenchmark

简单的数码照片浏览和处理 gThumb比默认的eog(Eye of Gnome)要好用得多,不仅稳定,功能也多一些,旋转图片的时候不仅不会改变文件的大小(不知道eog动了什么我一个1m多的图片旋转之后就剩下200+k了),exif信息也能够保存下来,建议换掉。

利用hdparm提速硬盘 hdparm -X66 -d1 -m16 -c1 /dev/hda -X66 ATA33=66, ATA66=68,此参数需谨慎设定,不懂最好不要用。 -d1 开启dma -m16 设定MultSect为MaxMultSect -c1 将操作模式设定为 32-bits 测试性能:hdparm -tT /dev/hda 保存设置:hdparm -k1 /dev/hda 查看设置:hdparm [-i] /dev/hda 不过好像保存设置不起作用,干脆写入到/etc/hdparm.conf文件得了,hdparm.conf中,hdparm命令的每一个参数都有一个对应的option,并且有详细的说明和例子,参照着写就可以了,这才是一劳永逸的办法。

/dev/hda { dma = on io32_support = 1 mult_sect_io = 16 #transfer_mode = 66 }

这四个选项分别对应上面说明的四个参数,基本上也是最常用的。

rpm形式的安装包转换为deb形式 alien xxx.rpm

Linux下有什么数据库设计工具或者建模工具么? 有的人使用wine模拟运行PowerDesigner,但似乎效果不怎么好。如果使用的是Mysql数据库,除了phpMyAdmin可用之外,还有DBDesigner,以及mysql官方的workbench(尚未正式发布)。据说DBDesigner也支持Oracle。参考1参考2《DBDesigner的安装》

按照机器名查询局域网内其他机器的ip nmblookup cmp 按ip查机器名: nmblookup -A 192.168.0.1 似乎只能查windows主机

我现在使用FireFox 1.5.0.3,还是存在着严重的内存泄露,并且我一般不关机,都只是休眠,如果你的习惯和我一样的话,记得每天休眠的时候要关掉FireFox,不然它睡觉的时候还会吃内存的。

我正在通过smb挂载着一个网上邻居的共享目录,可是对方突然关机了,我这里操作异常,并且无法umount,怎么办? 有时候在这种情况下是无法umount的,会提示设备忙,但是可以使用smbumount,一般都会成功的。 sudo smbumount /media/share/xjl-f

使用mencoder制作影片剪辑(截取、转换) mencoder source.avi -ss 5:00 -endpos 40 -oac mp3lame -ovc xvid -xvidencopts bitrate=800 -o target.avi 注意-endpos指定的是相对于ss要截取的时间长度,而不是绝对时间坐标。-oac copy就是直接复制源中的音频,不再单独压缩。

如何才能浏览中文的pdf文件? 不管是evince,或者是epdfview,默认安装都无法查看中文pdf文件的,会有乱码,解决方法: distro:ubuntu linux dapper 1 sudo apt-get install evince 2 sudo apt-get install xpdf-chinese-simplified 3 你需要一个中文字体,simsun,fireflysun皆可。 cd /usr/share/fonts sudo ln -s < 你的字体存放的路径> < 字体名>.ttf //记住一定是.ttf!!!不能是*.ttc,或是别的什么。我开始就挂在这里了 比如:sudo ln -s /media/hda1/windows/fonts/simsun.ttc simsun.ttf //我开始就挂在这里了 4 打开/etc/xpdf/xpdfrc-chinese-simplefied 将displayCIDFontTT改为 displayCIDFontTT Adobe-GB1 /usr/share/fonts/simsun.ttf 即可! 5 现在你的xpdf,evince都能显示中文了!

用gedit编辑过的文件在vi下看,每行末尾都加了一个^M,怎么去掉? 这个^M其实是兼容dos的回车,也就是\r,使用下面的命令替换掉: :%s/\r//g 可以看出替换命令s是支持正则表达式的。

php5的两个ini文件 其实只有一个的,为什么要说两个呢?一个在/etc/php5/apache2下,这个是给apache用的,另外一个是在/etc/php5/cli下,这个是给命令行的php用的,比如php -f somefile.php,或者#! /usr/bin/php开头的shell script。有的时候使用cli调试脚本的时候经常会忘记设置后面那个。

如何将应用程序加到菜单中? 见例: sudo gedit /usr/share/applications/Firefox1.5.0.2.desktop [Desktop Entry] Name=Firefox Web Browser Comment=Browse the World Wide Web Exec=/opt/firefox/firefox Icon=/opt/firefox/icons/mozicon128.png Terminal=false Type=Application Categories=Application;Network;

最后一行是Network的,就在Internet菜单下,Office,就在Office菜单下,System的,就在System Tools菜单下,其他的可以参照现有.desktop文件摸索设置。

安装jre 1.5 首先你要下载官方的java1.5的运行时。现在最新的是java1.5update6 http://java.sun.com/j2se/1.5.0/download.jsp 下载下来的bin文件,为了方便,我们把它转成deb文件,方便使用。先下载工具 sudo apt-get install fakeroot java-package java-common 开始转换 fakeroot make-jpkg jre-1_5_0_06-linux-i586.bin 好,不出意外的话,就应该转换成功了。 开始安装: sudo dpkg -i sun-j2re1.5_1.5.0+update06_i386.deb 然后配置: sudo update-alternatives –config java 参见咸鱼的文章

关闭IPV6 修改/etc/modprobe.d/aliases文件,增加: alias net-pf-10 ipv6 off alias net-pf-10 off alias ipv6 off 注释掉:

alias net-pf-10 ipv6

再新建一个/etc/modprobe.d/bad_list文件,内容为: alias net-pf-10 off 然后重启。

Azureus bt下载的小问题 安装以后无法启动(没有图形窗口):sudo update-alternatives –config java 默认的是选4,改成1,就是带有jre5字样的就可以了。 提示窗口无法隐藏:关掉azureus重新打开就没事了。

MPlayer字幕乱码 編輯 ~/.mplayer/config 加上如下

font=/usr/share/fonts/truetype/arphic/bkai00mp.ttf subcp=gb2312 subfont-autoscale=2 subfont-text-scale=5

而我通过在gui中测试得到的结果则是还需要加上:

vo_doublebuffering = “no” sub_unicode = “no” sub_cp = “cp936” font_encoding = “unicode”

各位再根据自己的实际情况改变上述几项参数的值应该就可以了。

安装显卡驱动(尤其是ati卡) 安装驱动:apt-get install xorg-driver-fglrx 安装nvidia卡驱动:apt-get install nvidia-glx 初始化nvidia的显卡:nvidia-glx-config enable 初始化ati的显卡:aticonfig –initial (或是 aticonfig –initial=dual-head) aticonfig –overlay-type=Xv

另:不要忘记安装linux-restricted-modules,注意如果从386的内核升级到了686的内核,686的restricted modules也不要忘记安装,否则会出现ati显卡fglrx驱动能够正常安装,却始终打不开direct rendering的怪问题。

另:我的ibm笔记本以前使用mplayer的时候,只能选择X11(Ximage/Shm),并且没法全屏播放(全屏以后仍然是小画面),安装完上面的驱动,并且修改了mplayer的config文件之后,居然可以选择(X11/xv)模式了,并且能够十分流畅的全屏播放,真是太好了。只是在检测显卡的时候,如果不选ati而是选择fglrx的话,X就无法启动,现在也不知道显卡到底驱动起来没有。

播放电影,包括rmvb 咸鱼翻身还是咸鱼那里有一篇很好的介绍,针对dapper的,非常实用(备份地址)。不过最好首先还是把dapper的更新源扩展一下。大体总结如下: 首先安装dapper的gstreamer,dapper好像已经自带了,breezy麻烦些:

sudo apt-get install gstreamer0.10-*

下载安装w32codecs

wget -c ftp://ftp.nerim.net/debian-marillat/pool/main/w/w32codecs/w32codecs_20050412-0.0_i386.deb sudo dpkg -i w32codecs_20050412-0.0_i386.deb

这时再安装上mplayer就能够正常播放电影了,注意好像使用dapper flight7的源是没有mplayer的,扩展一下就好了。如果还想使用其他的播放器的话,把totem换成xine的后端:

sudo apt-get install libxine-extracodecs totem-xine mplayer-686 ffmpeg lame faad sox mjpegtools libxine-main1

有用的链接 升级到Dapper的源source

挂载fat32移动硬盘分区,不乱码,可读写 mount /dev/sda1 /media/sda1 -t vfat -o iocharset=utf8,rw,umask=0 umount /media/sda1;

挂载网上邻居共享的ntfs分区,中文不乱码,普通用户可读写 mount -o username=xjl%,iocharset=utf8,codepage=cp936,dmask=777,fmask=777 //xjl/f /media/share/xjl-f; ls /media/share/xjl-f/ umount /media/share/xjl-f; iocharset用utf-8不行,必须是utf8,codepage用936也不行,必须是cp936。 -t smbfs可以不写,自动识别。其他参数在前在后也没关系。 dmask和fmask如果不指定,那么root以外的用户就只能读取或者执行(r+x)。

linux挂载linux的samba 挂载其他linux(utf8文件系统编码,samba的unix charset也设置为utf-8了)的时候,和上面挂载共享的ntfs分区的方式是一样的: mount //neighbour/sharedir /media/mountpoint -t samfs -o codepage=cp936,iocharset=utf8 这是要尤其注意的地方,即使两个linux都是utf8编码,好像也必须指定cp936才能够正常浏览和创建中文名称的文件! 另外还要尤其注意,//neighbour/sharedir和//neighbour/sharedir/是不一样的,注意最后有个斜线“/”,有的时候加上了这个斜线samba会不认,报出如下错误:

tree connect failed: ERRDOS – ERRnosuchshare (You specified an invalid share name) SMB connection failed

在英文系统下安装输入法无法调出输入栏的问题 有可能是因为没有设置使用中文输入法的缘故,只需要修改/etc/environment文件,添加:

LANGUAGE=”en_US:en” LC_CTYPE=zh_CN.UTF-8 LANG=en_US.UTF-8 #GST_ID3_TAG_ENCODING=GBK

然后重启x就可以了。

这样即不影响现有的英文操作界面,也能够使用中文的输入法(尤其是scim了),最后一句好像没有用,fcitx可能要用到。

下载工具

一般推荐Download 4 XProZilla,其中prozilla好象是命令行方式使用的。

安装压缩工具7-zip

apt-get install p7zip 7za or 7z to run command

还有系统带的tar也不错。

关闭不需要的服务

这样应该能够让系统运行得快一些,尤其是在虚拟机中运行的时候,在X下System->Administration->Services中关闭是一种简单的方法,但不解决最终的问题。

首先apt-get install sysv-rc-conf,安装这个,然后运行,并调整如下: 只在S等级启用:acpi-support 关闭:anacron, apmd, atd, bluez-utiles, fetchmail, hotkey-setup, hplip, pcmcia, powernowd, ppp, rsync. 如果是笔记本电脑,下面几个就不要关闭了:hotkey-setup, pcmcia, powernowd

这样应该能稍微快一些吧,错关了也没有关系,当需要的时候还可以再打开嘛。

安装编译环境 apt-get install build-essential

相关阅读:

利用SVN更新网站

如果你有一个假设在公网上的SVN服务器,而你的网站所在的主机允许你使用SVN客户端,并且开放了php的exec函数,那么你有福了,你可以利用SVN作为中转,更新你的网站程序。

首先,也是前提,就是你的网站程序是用SVN管理的,那么只要你的网站主机能够访问SVN,就能够使用SVN的update功能来更新程序。

准备工作一:将网站程序加上svn的控制标记,由于SVN的控制信息都存在程序所在目录的.svn子目录中,所以需要找一个空目录,并且将网站现有程序checkout到这个目录里面来,注意是checkout而不是export,因为接下来要将最新的网站程序连同他里面包含的很多个.svn目录一同上传到服务器上去。为了不让.svn目录泄露机密,要在.htaccess文件或者是httpd.conf中设定如下规则,禁止对.svn目录的访问。

	<directory ~ "\.svn">
		Order Allow,Deny
		Deny from all
	</directory>

准备工作二:作一段小程序,调用服务器上的svn命令行命令,update网站程序,下面是一个写好了的简单例子。

	//setup update target path
	$target_ar['fwolf'] = 'd:\fwolf';
 
	//setup commandline
	$svn_cmd1 = 'd:\server\svn\bin\svn.exe update ';
	$svn_cmd2 = ' --username updatebot --password xxxxxx --no-auth-cache';
 
	//output html string
	$html = '';	
 
	//recieve get parameter
	$target = isset($_GET['target']) ? $_GET['target'] : '';
	if (empty($target) || !isset($target_ar[$target]))
	{
		$html = 'Target does not correct.';
	}
	else
	{
		//execute svn update command
		$cmd = $svn_cmd1 . $target_ar[$target] . $svn_cmd2;
		$ar = array();
		$status = 0;
		exec($cmd, $ar, $status);
		for ($i=0; $i < count($ar); $i++)
			$ar[$i] = htmlspecialchars($ar[$i]);
		$html .= 'Status: ' . $status . "<br />\r\n";
		$html .= implode('<br />' . "\r\n", $ar);
	}
	echo $html;

把这个程序放到服务器上能够访问到的地方,也可以在此基础上加上一些访问限制,那么只要访问这个程序/页面,服务器就会自动更新你的网站啦。

	Status: 0
	D H:\cvswork\svntest\update_from_svn.php
	Updated to revision 44.

这样,在利用SVN很好的管理网站程序的基础上,还实现了服务器程序的很方便的更新,一举两得!尤其是在程序上传不是十分方便的场合,用起来就更舒服了,我就是在更换了一个劣质防火墙,ftp无法正常使用的情况下想出这个怪招儿的:-)。

Update @ 2007-07-31

如果在windows主机上使用本方法,而svn服务器是采用了ssl的https://…地址,那么会遇到一点小麻烦,就是在执行svn update的时候,由于使用的是web的用户,在出现确认证书的提示信息时,用户是无法输入的:

Error validating server certificate for 'https://20070731.fwolf.com':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: 20070731.fwolf.com
 - Valid: from Jul 31 06:49:53 2007 GMT until Jul 28 06:49:53 2017 GMT
 - Issuer: Fwolf, US
 - Fingerprint: 38:43:0b:29:75:1t:ba:d8:29:8f:94:9a:10:42:a0:fe:ae:93:4d:91
(R)eject, accept (t)emporarily or accept (p)ermanently?

这时就只能用变通的方法了,首先在dos方式中使用svn up,svn会自动缓存身份验证以及ssl确认信息,这些信息保存在C:\Documents and Settings\Administrator\Application Data\Subversion目录下,然后把这个目录整体拷贝到C:\Documents and Settings\Default User\Application Data\Subversion就可以了,测试环境windows2003,并且试过复制到All Users的对应目录无效。

另外修改配置文件servers,添加ssl-trust-default-ca = yes的方式在windows下好像没有作用。

Update @ 2009-04-07

Git(ssh证书登录)也可以这样用,略有不同,我使用的客户端是msysgit

  • Admin用户使用桌面操作(Git Bash)时,.ssh目录位于C:\Documents and Settings\Administrator\下。
  • 直接使用C:\Program Files\Git\bin\ssh.exe当ssh客户端时,.ssh目录要放到C:\Program Files\Git\下,并且似乎忽略.ssh/config文件,私钥文件只认identity id_rsa id_dsa三个。
  • 系统服务比如Apache运行时,使用上面一条的设置,很是诡异。

说公钥文件只认固定的三个,是从这里猜到的:

	Program Files/Git$ grep identity share -R
	share/git-gui/lib/sshkey.tcl:   foreach name {~/.ssh/id_dsa.pub ~/.ssh/id_rsa.pub ~/.ssh/identity.pub} {

好像是写死了,并且我用config定义其他私钥它也不认。第一条中使用Git的时候没事,很正常。

同时,为了安全起见,apache里还要增加如下设置:

	<Directory ~ "\.(git|svn)">
		Order allow,deny
		Deny from all
		Satisfy All
	</Directory>

subversion也需要设置“set LANG=en_US”

在服务器上下载了一个svn(zip格式,解压就可以的),原本是想利用svn作为中转/记录,实现网站远程上传和更新,但是解压之后,运行命令行命令svn.exe,却遇到了像下面这样的乱码:

D:\server\svn\bin>svn ?\232?\175?\183?\228?\189?\191?\231?\148?\168?\226?\128?\156svn help?\226?\128?\ 157?\228?\187?\165?\229?\190?\151?\229?\136?\176?\231?\148?\168?\230?\179?\149?\ 229?\146?\140?\229?\184?\174?\229?\138?\169?\227?\128?\130

这实在是让我纳闷了半天,按理说svn解压缩就行,连install脚本、程序都没有,怎么一运行就乱码呢?并且敲几个其他的svn命令观察,发现乱码还不一样,应该是svn正常的执行了,而输出内容不正常而已。

同样也是偶然的,发现了解决方法。记得在Sybase Open Client 和 GTK+有点小冲突,当时问题出在了环境变量LANG上,这个svn原来也使用了这个环境变量,当环境变量LANG设置为en_US以后,svn的输出信息就正常了。

C:\>set lang=en_us C:\>svn Type ‘svn help’ for usage.

现在把这个LANG设置到windows系统变量中,问题就解决了。

Update @ 2008-04-16

近日在用php实现svn的hooks脚本时发现,虽然使用的系统ubuntu的语言是en_US.UTF-8,但在php中仍然要将LANG设置为en_US才行(LANG设置为en_US.UTF-8就画蛇添足了),不过直接在php中更改环境变量是不行的:

putenv('LANG="en_US"'); 

这样只会影响php的环境,而php调用shell_exec()的时候,传递给命令的还是sh的默认环境,所以要在每次调用的时候强制指定环境变量。除了LANG以外,还要将LC_ALL赋值为en_US.UTF-8,这样才完全没有乱码,完整的结果如下:

$svn_log = shell_exec("env LANG=en_US LC_ALL=en_US.UTF-8 svnlook log $repos -r $rev");

参考:subversion的svn命令行显示乱码的解决