Thursday, July 23, 2009

Git|Everyday GIT With 20 Commands Or So

Everyday GIT With 20 Commands Or So

Everyday GIT With 20 Commands Or So

[Basic Repository] commands are needed by people who have a repository --- that is everybody, because every working tree of git is a repository.

In addition, [Individual Developer (Standalone)] commands are essential for anybody who makes a commit, even for somebody who works alone.

If you work with other people, you will need commands listed in the [Individual Developer (Participant)] section as well.

People who play the [Integrator] role need to learn some more commands in addition to the above.

[Repository Administration] commands are for system administrators who are responsible for the care and feeding of git repositories.

Basic Repository

Everybody uses these commands to maintain git repositories.

Examples

Check health and remove cruft.
$ git fsck (1) $ git count-objects (2) $ git gc (3)
  1. running without --full is usually cheap and assures the repository health reasonably well.

  2. check how many loose objects there are and how much disk space is wasted by not repacking.

  3. repacks the local repository and performs other housekeeping tasks.

Repack a small project into single pack.
$ git gc (1)
  1. pack all the objects reachable from the refs into one pack, then remove the other packs.

Individual Developer (Standalone)

A standalone individual developer does not exchange patches with other people, and works alone in a single repository, using the following commands.

Examples

Use a tarball as a starting point for a new repository.
$ tar zxf frotz.tar.gz $ cd frotz $ git init $ git add . (1) $ git commit -m "import of frotz source tree." $ git tag v2.43 (2)
  1. add everything under the current directory.

  2. make a lightweight, unannotated tag.

Create a topic branch and develop.
$ git checkout -b alsa-audio (1) $ edit/compile/test $ git checkout -- curses/ux_audio_oss.c (2) $ git add curses/ux_audio_alsa.c (3) $ edit/compile/test $ git diff HEAD (4) $ git commit -a -s (5) $ edit/compile/test $ git reset --soft HEAD^ (6) $ edit/compile/test $ git diff ORIG_HEAD (7) $ git commit -a -c ORIG_HEAD (8) $ git checkout master (9) $ git merge alsa-audio (10) $ git log --since='3 days ago' (11) $ git log v2.43.. curses/ (12)
  1. create a new topic branch.

  2. revert your botched changes in curses/ux_audio_oss.c.

  3. you need to tell git if you added a new file; removal and modification will be caught if you do git commit -a later.

  4. to see what changes you are committing.

  5. commit everything as you have tested, with your sign-off.

  6. take the last commit back, keeping what is in the working tree.

  7. look at the changes since the premature commit we took back.

  8. redo the commit undone in the previous step, using the message you originally wrote.

  9. switch to the master branch.

  10. merge a topic branch into your master branch.

  11. review commit logs; other forms to limit output can be combined and include --max-count=10 (show 10 commits), --until=2005-12-10, etc.

  12. view only the changes that touch what's in curses/ directory, since v2.43 tag.

Individual Developer (Participant)

A developer working as a participant in a group project needs to learn how to communicate with others, and uses these commands in addition to the ones needed by a standalone developer.

  • git-clone(1) from the upstream to prime your local repository.

  • git-pull(1) and git-fetch(1) from "origin" to keep up-to-date with the upstream.

  • git-push(1) to shared repository, if you adopt CVS style shared repository workflow.

  • git-format-patch(1) to prepare e-mail submission, if you adopt Linux kernel-style public forum workflow.

Examples

Clone the upstream and work on it. Feed changes to upstream.
$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6 $ cd my2.6 $ edit/compile/test; git commit -a -s (1) $ git format-patch origin (2) $ git pull (3) $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 (4) $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL (5) $ git reset --hard ORIG_HEAD (6) $ git gc (7) $ git fetch --tags (8)
  1. repeat as needed.

  2. extract patches from your branch for e-mail submission.

  3. git pull fetches from origin by default and merges into the current branch.

  4. immediately after pulling, look at the changes done upstream since last time we checked, only in the area we are interested in.

  5. fetch from a specific branch from a specific repository and merge.

  6. revert the pull.

  7. garbage collect leftover objects from reverted pull.

  8. from time to time, obtain official tags from the origin and store them under .git/refs/tags/.

Push into another repository.
satellite$ git clone mothership:frotz frotz (1) satellite$ cd frotz satellite$ git config --get-regexp '^(remote|branch)\.' (2) remote.origin.url mothership:frotz remote.origin.fetch refs/heads/*:refs/remotes/origin/* branch.master.remote origin branch.master.merge refs/heads/master satellite$ git config remote.origin.push \            master:refs/remotes/satellite/master (3) satellite$ edit/compile/test/commit satellite$ git push origin (4)  mothership$ cd frotz mothership$ git checkout master mothership$ git merge satellite/master (5)
  1. mothership machine has a frotz repository under your home directory; clone from it to start a repository on the satellite machine.

  2. clone sets these configuration variables by default. It arranges git pull to fetch and store the branches of mothership machine to local remotes/origin/* tracking branches.

  3. arrange git push to push local master branch to remotes/satellite/master branch of the mothership machine.

  4. push will stash our work away on remotes/satellite/master tracking branch on the mothership machine. You could use this as a back-up method.

  5. on mothership machine, merge the work done on the satellite machine into the master branch.

Branch off of a specific tag.
$ git checkout -b private2.6.14 v2.6.14 (1) $ edit/compile/test; git commit -a $ git checkout master $ git format-patch -k -m --stdout v2.6.14..private2.6.14 |   git am -3 -k (2)
  1. create a private branch based on a well known (but somewhat behind) tag.

  2. forward port all changes in private2.6.14 branch to master branch without a formal "merging".

Integrator

A fairly central person acting as the integrator in a group project receives changes made by others, reviews and integrates them and publishes the result for others to use, using these commands in addition to the ones needed by participants.

Examples

My typical GIT day.
$ git status (1) $ git show-branch (2) $ mailx (3) & s 2 3 4 5 ./+to-apply & s 7 8 ./+hold-linus & q $ git checkout -b topic/one master $ git am -3 -i -s -u ./+to-apply (4) $ compile/test $ git checkout -b hold/linus && git am -3 -i -s -u ./+hold-linus (5) $ git checkout topic/one && git rebase master (6) $ git checkout pu && git reset --hard next (7) $ git merge topic/one topic/two && git merge hold/linus (8) $ git checkout maint $ git cherry-pick master~4 (9) $ compile/test $ git tag -s -m "GIT 0.99.9x" v0.99.9x (10) $ git fetch ko && git show-branch master maint 'tags/ko-*' (11) $ git push ko (12) $ git push ko v0.99.9x (13)
  1. see what I was in the middle of doing, if any.

  2. see what topic branches I have and think about how ready they are.

  3. read mails, save ones that are applicable, and save others that are not quite ready.

  4. apply them, interactively, with my sign-offs.

  5. create topic branch as needed and apply, again with my sign-offs.

  6. rebase internal topic branch that has not been merged to the master, nor exposed as a part of a stable branch.

  7. restart pu every time from the next.

  8. and bundle topic branches still cooking.

  9. backport a critical fix.

  10. create a signed tag.

  11. make sure I did not accidentally rewind master beyond what I already pushed out. ko shorthand points at the repository I have at kernel.org, and looks like this:

    $ cat .git/remotes/ko URL: kernel.org:/pub/scm/git/git.git Pull: master:refs/tags/ko-master Pull: next:refs/tags/ko-next Pull: maint:refs/tags/ko-maint Push: master Push: next Push: +pu Push: maint

    In the output from git show-branch, master should have everything ko-master has, and next should have everything ko-next has.

  12. push out the bleeding edge.

  13. push the tag out, too.

Repository Administration

A repository administrator uses the following tools to set up and maintain access to the repository by developers.

  • git-daemon(1) to allow anonymous download from repository.

  • git-shell(1) can be used as a restricted login shell for shared central repository users.

update hook howto has a good example of managing a shared central repository.

Examples

We assume the following in /etc/services
$ grep 9418 /etc/services git             9418/tcp                # Git Version Control System
Run git-daemon to serve /pub/scm from inetd.
$ grep git /etc/inetd.conf git     stream  tcp     nowait  nobody \   /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm

The actual configuration line should be on one line.

Run git-daemon to serve /pub/scm from xinetd.
$ cat /etc/xinetd.d/git-daemon # default: off # description: The git server offers access to git repositories service git {         disable = no         type            = UNLISTED         port            = 9418         socket_type     = stream         wait            = no         user            = nobody         server          = /usr/bin/git-daemon         server_args     = --inetd --export-all --base-path=/pub/scm         log_on_failure  += USERID }

Check your xinetd(8) documentation and setup, this is from a Fedora system. Others might be different.

Give push/pull only access to developers.
$ grep git /etc/passwd (1) alice:x:1000:1000::/home/alice:/usr/bin/git-shell bob:x:1001:1001::/home/bob:/usr/bin/git-shell cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell david:x:1003:1003::/home/david:/usr/bin/git-shell $ grep git /etc/shells (2) /usr/bin/git-shell
  1. log-in shell is set to /usr/bin/git-shell, which does not allow anything but git push and git pull. The users should get an ssh access to the machine.

  2. in many distributions /etc/shells needs to list what is used as the login shell.

CVS-style shared repository.
$ grep git /etc/group (1) git:x:9418:alice,bob,cindy,david $ cd /home/devo.git $ ls -l (2)   lrwxrwxrwx   1 david git    17 Dec  4 22:40 HEAD -> refs/heads/master   drwxrwsr-x   2 david git  4096 Dec  4 22:40 branches   -rw-rw-r--   1 david git    84 Dec  4 22:40 config   -rw-rw-r--   1 david git    58 Dec  4 22:40 description   drwxrwsr-x   2 david git  4096 Dec  4 22:40 hooks   -rw-rw-r--   1 david git 37504 Dec  4 22:40 index   drwxrwsr-x   2 david git  4096 Dec  4 22:40 info   drwxrwsr-x   4 david git  4096 Dec  4 22:40 objects   drwxrwsr-x   4 david git  4096 Nov  7 14:58 refs   drwxrwsr-x   2 david git  4096 Dec  4 22:40 remotes $ ls -l hooks/update (3)   -r-xr-xr-x   1 david git  3536 Dec  4 22:40 update $ cat info/allowed-users (4) refs/heads/master       alice\|cindy refs/heads/doc-update   bob refs/tags/v[0-9]*       david
  1. place the developers into the same git group.

  2. and make the shared repository writable by the group.

  3. use update-hook example by Carl from Documentation/howto/ for branch policy control.

  4. alice and cindy can push into master, only bob can push into doc-update. david is the release manager and is the only person who can create and push version tags.

HTTP server to support dumb protocol transfer.
dev$ git update-server-info (1) dev$ ftp user@isp.example.com (2) ftp> cp -r .git /home/user/myproject.git
  1. make sure your info/refs and objects/info/packs are up-to-date

  2. upload to public HTTP server hosted by your ISP.

Git| for the lazy - beginer

Git for the lazy - Spheriki

Git for the lazy

From Spheriki

Jump to: navigation, search

git is a distributed version control system. No, you don't need to know what that means to use this guide. Think of it as a time machine: Subversion or CVS without the suck.

If you make a lot of changes, but decided you made a mistake, this will save your butt.

This guide is for people who want to jump to any point in time with their project/game/whatever, and want something to use for themselves.


Contents

[hide]

Install git

Windows

  1. Download Cygwin.
  2. Put setup.exe in a folder of its own in your documents.
  3. Launch setup.exe.
  4. While installing Cygwin, pick these packages:
    • git from the DEVEL category
    • nano (if you're wimpy) or vim (if you know it), both in the EDITORS category

You'll now have a shortcut to launch Cygwin, which brings up something like the Linux terminal.

Linux

Install the git package using your preferred method (package manager or from source).


Introduce yourself to git

Fire up your Cygwin/Linux terminal, and type:

git config --global user.name "Joey Joejoe" git config --global user.email "joey@joejoe.com" 

You only need to do this once.


Start your project

Start your project using the Sphere editor, or from a ZIP file, or just by making the directory and adding files yourself.

Now cd to your project directory:

cd myproject/ 

Tell git to start giving a damn about your project:

git init 

... and your files in it:

git add . 

Wrap it up:

git commit 

Now type in a "commit message": a reminder to yourself of what you've just done, like:

Initial commit. 

Save it and quit (type Ctrl+o Ctrl+x if you're in nano, :x if you're in vim) and you're done!


Work in bits

When dealing with git, it's best to work in small bits. Rule of thumb: if you can't summarise it in a sentence, you've gone too long without committing.

This section is your typical work cycle:

  1. Work on your project.
  2. Check which files you've changed:
    git status
  3. Check what the actual changes were:
    git diff
  4. Add any files/folders mentioned in step 2 (or new ones):
    git add file1 newfile2 newfolder3
  5. Commit your work:
    git commit
  6. Enter and save your commit message. If you want to back out, just quit the editor.

Repeat as much as you like. Just remember to always end with a commit.


Admire your work

To see what you've done so far, type:

git log 

To just see the last few commits you've made:

git log -n3 

Replace 3 with whatever you feel like.

For a complete overview, type:

git log --stat --summary 

Browse at your leisure.


View changes

To view changes you haven't committed yet:

git diff 

If you want changes between versions of your project, first you'll need to know the commit ID for the changes:

git log --pretty=oneline 
6c93a1960072710c6677682a7816ba9e48b7528f Remove persist.clearScriptCache() function. c6e7f6e685edbb414c676df259aab989b617b018 Make git ignore logs directory. 8fefbce334d30466e3bb8f24d11202a8f535301c Initial commit. 

The 40 characters at the front of each line is the commit ID. You'll also see them when you git commit. You can use it to show differences between commits.

To view the changes between the 1st and 2nd commits, type:

git diff 8fef..c6e7 

Note how you didn't have to type the whole thing, just the first few unique characters are enough.

To view the last changes you made:

git diff HEAD^..HEAD 


How to fix mistakes

Haven't committed yet, but don't want to save the changes? You can throw them away:

git reset --hard 


You can also do it for individual files, but it's a bit different:

git checkout myfile.txt 


Messed up the commit message? This will let you re-enter it:

git commit --amend 


Forgot something in your last commit? That's easy to fix.

git reset --soft HEAD^ 

Add that stuff you forgot:

git add forgot.txt these.txt 

Then write over the last commit:

git commit 

Don't make a habit of overwriting/changing history if it's a public repo you're working with, though.


For the not so lazy

Just some extra reading here. Skip it if you're lazy.


Writing good commit messages

This part is all opinion, but worth reading.

Your first line should be a summary of the commit changes in a single sentence. It should be 50 characters or less. It should be in present tense: this matches up with git's merge commit messages, which you haven't met yet, but you'll eventually run into when you hit branching and merging.

The remaining body should go into more detail if needed. I use point form: a space, an asterisk (*), another space, followed by the point in detail.

e.g.

Add feature X to subsystem Y.   * Feature X isn't working well with feature Z. Worth investigating.  * Feature X still doesn't work for inputs A, B and C. 


Ignoring files

When you check your project status, sometimes you'll get something like this:

git status 
# On branch master # Untracked files: #   (use "git add <file>..." to include in what will be committed) # #       bleh.txt #       module.c~ nothing added to commit but untracked files present (use "git add" to track) 

If you don't want git to track these files, you can add entries to .gitignore:

nano .gitignore 

And add the files you want ignored:

bleh.txt *~ 

The first line ignores bleh.txt the second line ignores all files and directories ending with a tilde (~), i.e. backup files.

You can check if you got it right:

git status 
# On branch master # Changed but not updated: #   (use "git add <file>..." to update what will be committed) # #       modified:   .gitignore # no changes added to commit (use "git add" and/or "git commit -a") 

Don't forget to commit your changes to .gitignore!

git add .gitignore git commit 

With something like this for your commit message:

Make git ignore bleh.txt and backup files. 

Use .gitignore to keep your messages clean, and stop git from bugging you about stuff you don't care about. It's a good idea to ignore things like executable binaries, object files, etc. Pretty much anything that can be regenerated from source.


Branching and merging

A branch is a separate line of development. If you're going to make a bunch of changes related to a single feature, it might be a good idea to make a "topic branch": a branch related to a topic/feature.

To make a new branch:

git branch feature_x 

To view the current branches:

git branch 
  feature_x * master 

The asterisk (*) shows your current branch. master is the default branch, like the trunk in CVS or Subversion.

To switch to your new branch, just type:

git checkout feature_x 

If you check the branches again, you'll see the switch:

git branch 
* feature_x   master 

Now go through the usual edit/commit cycle. Your changes will go onto the new branch.

When you want to put your branch changes back onto master, first switch to master:

git checkout master 

Then merge the branch changes:

git merge feature_x 

This will combine the changes of the master and feature_x branches. If you didn't change the master branch, git will just "fast-forward" the feature_x changes so master is up to date. Otherwise, the changes from master and feature_x will be combined.

You can see the commit in your project's log:

git log -n1 

If you're happy with the result, and don't need the branch any more, you can delete it:

git branch -d feature_x 

Now when you see the branches, you'll only see the master branch:

git branch 
* master 

You can make as many branches as you need at once.


Tags

If you hit a new version of your project, it may be a good idea to mark it with a tag. Tags can be used to easily refer to older commits.

To tag the current version of your project as "v1.4.2", for example:

git tag v1.4.2 

You can use these tags in places where those 40-character IDs appear.


What now?

git can help with working with other people too. Of course, then you do have to learn about distributed version control. Until then, just enjoy this page.

But if you want to learn:

Main git selling points (ripped off the main site):

  • Distributed development, i.e. working with other people.
  • Strong support for non-linear development, i.e. working with other people at the same time!
  • Efficient handling of large projects, i.e. fast!
  • Cryptographic authentication of history, for the paranoid.
  • Scriptable toolkit design, you can script pretty much any git task.


If something doesn't seem right or is confusing, contact me at my blog. --tunginobi 10:14, 28 February 2009 (GMT)

Git|大步向前走: [Linux][軟體] Git-svn 使用簡單介紹

大步向前走: [Linux][軟體] Git-svn 使用簡單介紹

[Linux][軟體] Git-svn 使用簡單介紹

這個 git 版本控管軟體出來一段時間了,不過因為作者是 Linus Torvalds,所以一來說,他寫 code 的功力很好,所以軟體品質不錯,二來也是因為他的名氣的關係,所以這個軟體在 Linux 上面的支援很多(??) (Win32 的 git support 很少,不過可以參考一下)

這邊要來介紹的是 git 在 svn 上面的一個過渡應用(git-svn),以及在 git 和 svn 之間的比較:
首先說明,這個應用方式的好處在於:
1. 保留 svn 的優點, svn 有一堆 properties 給我用的很高興,像 keywords 、很簡單就可以設定好的 ignore list 、 executable 、 permission、 ownership -> 所以 repo 用的是 svn 。
2. 比 svk 快。 (svk transaction 式的通訊方式,做到一半掛點會從頭再來過,如果這個 commit 一次是上 Giga 的量,掛點時,我想你會很想哭,因為記憶體也吃很多, performance 還是一樣的爛。 Git 就好多了。)
3. 分散式的 repo ,所以你可以在 local commit 了,測試完成,才 "merge" 到 server 上面。(merge 是用 svk/svn 的用詞)

用法介紹:

在開始動作之前,我們先來搞個小動作,寫一些東西到 $HOME/.gitconfig
[user]
name = Anton Yu
email = xxxx@gmail.com
[color]
diff = auto
status = auto
branch = auto
[alias]
st = status
rb = svn rebase
ci = commit -a
co = checkout

這些東西包括了 alias, 個人的 email 還有 git 的 colordiff 等等設定。

$ mkdir gtalkbot 先找個地方來放 code
再找出 svn url 來,像是
https://gtalkbot.googlecode.com/svn/trunk/ 
執行:
$ git-svn init https://gtalkbot.googlecode.com/svn/trunk/ gtalkbot/
$ git-svn fetch


做完你就會發現你已經有一個 .git 的目錄在這裡了,不過跟 svn 不一樣的是,它並沒有每個子目錄都放 .git ,只有這個 root dir 放了一個 .git 而已,所以你可以很輕鬆的做到 (export) 的動作,而不需要特別的指令。

更新時,請下 git rb (就會自動執行 git svn rebase)
刪除檔案,請下 git-rm $file
新增檔案,請下 git-add $file
commit ,請下 git-svn ci
commit 到 svn 底下,請下 git-svn dcommit

不過 props 在 git 底下連 "svn:executable" 都失效。 所以不建議 svn 的使用者在沒有考慮周祥之前就轉移過來這個 SCM 管理平台。畢竟它的軟體生命才剛開始而已。

GIT|SVN+GIT=鱼与熊掌兼得

SVN+GIT=鱼与熊掌兼得 - Step Third - JavaEye技术网站

SVN+GIT=鱼与熊掌兼得

关键字: svn git
使用git已经有一段时间了,从使用git的第一天开始,就计划逐步放弃svn.

svn有的功能,git都能做到,而且做得更出色,况且git还有很多特性svn望尘莫及,还有什么理由继续使用svn呢?

well,理由很多. 比如,git在windows上的性能问题, TortoiseGIT还没有开发出来(或者根本没有这个计划?),团队中其它人员不习惯用git....等等.

那么,鱼与熊掌,能否兼得?

=== SVN 之痛与痒 ===

svn的最大问题是不支持分布式开发. 分布式并不一定就是指象Linux Kernel那样的大型协作开发场景.

例如,你想把没做完的工作带回家做,但是家里又不能连线到公司的svn服务器,那么你就不能commit. 实际上,这也是一种分布式开发的场景.

你会说,那你就不要commit啊 ... 我办不到, 我有个坏习惯,经常做些小改动,但是十分钟后就后悔了想改回来,只有经常commit我才能找回上次,上上次变更.

当然,我有坏习惯因此我不会commit到trunk或主branch上,否则会被扁死 :-)
所以,我经常有很多临时branch要merge,频率非常之高...在svn中的merge并不好玩.

不得不说,svn的repository设计很糟糕. 慢, 特别是在项目规模上去,开发周期长时,repository迅速膨胀.项目树中到处都是.svn也是很讨厌.

但是, TortoiseSVN实在是方便, 很多人使用SVN就是因为图这个方便.
支持SVN的IDE也数不胜数.

SVN,既痛又痒....

=== GIT 的威力 ===

git很快,真的很快,比小李飞刀还快...(当然是在Linux下).
试试checkout Linux Kernel的各个tag,那个速度,不得不佩服,呵呵~

其实对于小项目来说,速度倒无所谓,不差那么几秒,git还有很多cool things.

git diff很强大,真的很强大.比较任何两个历史版本,速度飞快.

git中做branch简直太简单了,branch merge也是非常的爽,更不用说three way merge了. 当然还有很多很cool的特性,例如,与别人的git tree进行merge ... 其实这些或多或少都是由于分布式的特性带来的.

还有那些通过email commit等等一般小团队开发用不到的功能,就不多说了.

=== 鱼与熊掌兼得 ===

首先,svn照用,主版本管理用svn(照顾团队嘛).

然后在项目目录下建git repository: git init.
这只在项目根目录下多出一个.git目录,不会象svn或cvs那样,每个子目录都有它的垃圾.

接下来,建立.gitignore文件,把不需要git管理的文件,加入此表,例如.svn. 或者进入.git/info编辑exclude文件.

加入git: git add .

完成了,就这么简单.

从此以后,小的,临时的改动,通通用git来管理,又快又准,还不影响别人. 因为你只用到本地git repository,与其他人无关.

各人建各人自己的git tree,互不干扰. 当然,如果你想日后某一天可以merge别人的tree,那么还是建一个bare public tree吧, 各人clone一个,然后工作在自己的branch下,平时还是照样离线commit,需要时push.

在家里工作?没问题,照样可以commit,git是分布式的.

回到公司后,想commit到svn?没问题,在git中checkout你想要的"working code"版本,再在svn中commit, 然后git再checkout HEAD,继续前行

=== 结论 ===

svn和git结合, 可以带来以下好处:
1) 与单独使用svn的其它组员不冲突
2) 享受git分布式带来的好处
3) 可以满足svn commit working code的需求
4) svn大粒度管理,减轻svn repository的压力.
5) svn继续发挥GUI便利的优势.

所以, SVN + GIT = 鱼与熊掌兼得

Git|入门教程_想小多多的大黄

Git入门教程_想小多多的大黄

Git入门教程
2008-06-21 01:20

    考虑到CVS的一些局限性,最近和同事在公司推行Git

    其实,如果推行SVN的化,可能推行的难度会降低很多。不过lark说既然推行一个新的版本管理工具,总要花费一定的时间进行培训、部署、转换。而推行GitSVN的代价不如想象中差距那么大。因此,不如就多花些精力推行Git , 可以带来更多的好处。 这个想法说服了我。 然后就开始筹备了。 我发现网上很多git教程对一些基础命令(比如git-reset)的介绍还是不够清楚。另外,介绍git1.5的少,介绍git1.4的多。此外,对于如何基于Git合作开发,介绍的内容也是少之又少。因此,决定写一份教程,以减少在公司推广Git的培训代价。

    其实我也是一个Git的新手。 写这份教程也是我自己学习和摸索git的过程,其中基于Git进行合作开发的模式参考了CVS,应该是很初级的合作模式。但是当前自己也只能做到这一步了。 教程所述都是自己通过试验验证的。至少可以满足公司基本的合作开发。教程写完后,谢欣说可以放到blog与大家共享。我觉得是个不错的主意。一方面我觉得这个文档应该可以给git的新手一些帮助,另一方面也欢迎git的大牛指点。 这里要感谢《Git 中文教程》的作者。还有概述中关于git的优点描述拷贝了网络上某位大牛的原话,但是拷贝的出处也是转载的,就在这里谢谢那位我不知名大牛了。

    下面就开始了。

1.   概述
    对于软件版本管理工具,酷讯决定摒弃CVS而转向Git了。
    为什么要选择Git? 你真正学会使用Git时, 你就会觉得这个问题的回答是非常自然的。然而当真正需要用文字来回答时,却觉得文字好像不是那么够用。 咳,该则么回答呢?
    其实,关键的问题不在于如何回答这个问题。 问题的关键是公司已经决定使用它了。那么,我们的程序员们! 请开动你们的浏览器,请拿出你的搜索引擎工具,去自己发掘答案吧。在这里,我只能给你们一个最朦胧的感觉。
    Git和 CVS、SVN不同,是一个分布式的源代码管理工具。Linux内核的代码就是用Git管理的。它很强,也很快。它给我们带来的直接好处有:
1.       傻瓜都会的初始化,git init, git commit -a, 就完了。对于随便写两行代码就要放到代码管理工具里的人来说,再合适不过。也可以拿git做备份系统,或者同步两台机器的文档,都很方便。
2.         绝大部分操作在本地完成,不用和集中的代码管理服务器交互,终于可以随时随地大胆地check in代码了。 只有最终完成的版本才需要向一个中心的集中的代码管理服务器提交。
3.         每次提交都会对所有代码创建一个唯一的commit id。不像CVS那样都是对单个文件分别进行版本的更改。所以你可以一次性将某次提交前的所有代码check出来,而不用考虑到底提交过那些文件。(其实SVN也可以做到这点)
4.         branch管理容易多了,无论是建立新的branch,还是在branch之间切换都一条命令完成,不需要建立多余的目录。
5.         branch之间merge时,不仅代码会merge在一起,check in历史也会保留,这点非常重要。
6.         … 太多了
    当然,Git也会带给我们一些困难,首先,你想要使用好git,就要真正明白它的原理,理解它的观念, 对以那些CVS的熟手来说,改变你已经固有的纯集中式源代码管理的观念尤为重要,同时也会让你觉得有些困难。在使用git的初期,你可能会觉得有些困难,但等你逐渐明白它时,你绝对会喜欢上它。这是一定的,就像我问你"喜欢一个温吞如水、毫无感觉的主妇,还是喜欢一个奔放如火,让你爱的痴狂恨的牙痒的情人"一样毋庸置疑。
    下面,就让我们进入学习Git之旅…
    请记住,这只是一个非常简单而且初级的教程, 想要成为git的专家,需要各位同事不断的自己深入挖掘。
2.   Git基础命令

2.1   创建Git库—git-init
    你们曾经创建过CVS的库么?应该很少有人操作过吧?因为很多人都是从CVS库里checkout代码。同样,在合作开发中,如果你不是一个代码模块的发起者,也不会使用到这个命令,更多的是使用git-clone(见2.7节)。 但是,如果你想个人开发一个小模块,并暂时用代码管理工具管理起来(其实我就常这么做,至少很多个人开发过程都可以保留下来,以便备份和恢复),创建一个Git库是很容易和方便的。
对于酷讯来说,当一个代码的Git库创建后,会添加代码文件到库里,并将这个库放到公司一个专门用来进行代码管理的服务器上,使大家可以在以后clone(不明白?没关系,继续往后看就明白了)它。对于个人来说,你可以随便将这个库放到哪里,只要你能访问的到就行。

    创建一个Git库是很容易和方便的,只要用命令 git-init 就可以了。在Git1.4之前(包括git1.4)的版本,这个命令是git-init。
a)         $ mkdir dir
b)        $ cd dir
c)         $ git-init
    这样,一个空的版本库就创建好了,并在当前目录中创建一个叫 .git 的子目录。以后,所以的文件变化信息都会保存到这个目录下,而不像CVS那样,会在每个目录和子目录下都创建一个讨厌的CVS目录。
在.git目录下有一个config文件, 需要我们添加一下个人信息后才能使用。否则我们不能对其中添加和修改任何文件。
    原始的config文件是这样的,
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
我们需要加入
[user]
        name = xxx
        emai= xxx@kuxun.cn
    现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情,下一步就是怎么向版本库中添加文件了。如果希望忽略某些文件,需要在git库根目录下添加. gitignore文件。
2.2   一条重要的命令 -- git-update-index
    在介绍如何向git库中添加文件前,不得不先介绍git-update-index命令。这条命令可能会使很多熟悉CVS的用户疑惑, 一般来说,我们向一个源代码管理库提交代码的更改,都会抽象为以下的动作:更改文件;向源码管理系统标识变化;提交。比如从一个CVS库里删除一个文件,需要先删除文件,然后cvs delete; 最后cvs commit。
因此, git-update-index就是向源码管理系统标识文件变化的一个抽象操作。说的简要一些,git-update-index命令就是通知git库有文件的状态发生了变化(新添、修改、删除等待)。这条命令在早期的git版本中是非常常用的。 在新的git版本(1.5版本及以后)已经被其它命令包装起来,并且不推荐使用了。
    git-update-index最常用的方式有以下两种,更多功能请man git-update-index。
 方法一:git-update-index --add 文件名列表。 如果文件存在,则这条命令是向git库标识该文件发生过变化(无论是否该文件确实被修改过),如果文件不存在,则这条命令是向git库表示需要加入一个新文件。
 方法二: git-update-index --force-remove 文件名列表。 这表示向git库表示哟啊从库中删除文件。无论该文件是否已经被删除,这条命令仅仅是通知git库要从库中删除这些文件。这些文件都不会受影响。
    因此,git-update-index仅仅是向git库起到一个通知和标识的作用,并不会操作具体的文件。
2.3   向git库中添加或删除文件 – git-add、git-rm
    其实,说使用git-add命令向git库里添加文件是不对的, 或者说至少是不全面的。git-add 命令的本质是命令"git-update-index --add" 的一个包装。因此,git-add除了可以添加文件,还可以标识文件修改。在调用了git-add后,才可以做commit操作。git-rm 也是一样, 它是git-update-index --force-remove的一个包装。
    对于git-add来说, 如果在一个目录下调用了git-add * ,则默认是递归将子目录中所有文件都add到git库中。对于git-rm来说,也是一样。 这点和CVS有较大区别。
    此外,我们还可以通过命令git-ls-files来查看当前的git库中有那些文件。

2.4   查看版本库状态—git-status
    通过该命令,我们可以查看版本库的状态。可以得知那些文件发生了变化,那些文件还没有添加到git库中等等。 建议每次commit前都要通过该命令确认库状态。以避免误操作。
    其总,最常见的误操作是, 修改了一个文件, 没有调用git-add通知git库该文件已经发生了变化就直接调用commit操作, 从而导致该文件并没有真正的提交。如果这时如果开发者以为已经提交了该文件,就继续修改甚至删除这个文件,那么修改的内容就没有通过版本管理起来。如果每次在提交前,使用git-status查看一下,就可以发现这种错误。因此,如果调用了git-status命令,一定要格外注意那些提示为"Changed but not updated:"的文件。 这些文件都是与上次commit相比发生了变化,但是却没有通过git-add标识的文件。
2.5   向版本库提交变化 – git-commit
    直接调用git-commit命令,会提示填写注释。也可以通过如下方式在命令行就填写提交注释:git-commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不同,git的提交注释必须不能为空。否则就会提交失败。
    git-commit还有一个 –a的参数,可以将那些没有通过git-add标识的变化一并强行提交,但是不建议使用这种方式。
    每一次提交,git就会为全局代码建立一个唯一的commit标识代码,用户可以通过git-revert命令恢复到任意一次提交时的代码。 这比CVS不同文件有不同的版本呢号管理可方便多了。(和SVN类似)
    如果提交前,想看看具体那些文件发生变化,可以通过git-diff来查看, 不过这个命令的输出并不友好。因此建议用别的工具来实现该功能。在提交后,还可以通过git-log命令来查看提交记录。
2.6   分支管理 – git-branch
    我们迎来了git最强大,也是比CVS、SVN强大的多的功能 — 分支管理。
    大概每个程序员都会经常遇到这样的情况:
1.       需要立刻放下手头的工作,去修改曾经一个版本的bug并上线,然后再继续当的工作。
2.       本想向中心库commit一个重要修改,但是由于需要经常备份代码,最终不得不频繁的向中心库commit。从而导致大量无用的commit信息被保留在中心库中。
3.       将一次修改提交同事进行code review, 但是由于同事code review比较慢, 得到反馈时,自己的代码已经发生了变化,从而倒是合并异常困难
    这些场景,如果用CVS或者SVN来解决,虽说不一定解决不了,但过程之繁琐,之复杂,肯定另所有人都有生不如死的感觉吧!究其关键,就是CVS或者SNV的branch管理太复杂,基本不具可用性。
    在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支。当第一次执行git-init时,系统就会创建一个名为"master"的分支。 而其它分支则通过手工创建。下面列举一些常见的分支策略,这些策略相信会对你的日常开发带来很大的便利。
 1.创建一个属于自己的个人工作分支,以避免对主分支 master 造成太多的干扰,也方便与他人交流协作。
 2.当进行高风险的工作时,创建一个试验性的分支,扔掉一个烂摊子总比收拾一个烂摊子好得多。
 3.合并别人的工作的时候,最好是创建一个临时的分支用来合并,合并完成后在"fatch"到自己的分支(合并和fatch后面有讲述,不明白就继续往下看好了)
2.6.1 查看分支 – git-branch
    调用git-branch可以查看程序中已经存在的分支和当前分支
2.6.2 创建分支 – git-branch 分支名
    要创建一个分支,可以使用如下方法:
1.       git-branch 分支名称
2.       git-checout –b 分支名
    使用第一种方法,虽然创建了分支,但是不会将当前工作分支切换到新创建的分支上,因此,还需要命令"git-checkout 分支名" 来切换, 而第二种方法不但创建了分支,还将当前工作分支切换到了该分支上。
    另外,需要注意,分支名称是有可能出现重名的情况的, 比如说,我在master分支下创建了a和b两个分支, 然后切换到b分支,在b分支下又创建了a和c分支。 这种操作是可以进行的。 此时的a分支和master下的a分支实际上是两个不同的分支。 因此,在实际使用时,不建议这样的操作,这样会带来命名上的疑惑。
2.6.3 删除分支 – git-branch –D
    git-branch –D 分支名可以删除分支,但是需要小心,删除后,发生在该分支的所有变化都无法恢复。
2.6.4 切换分支 – git-checkout 分支名
    如果分支已经存在, 可以通过 git-checkout 分支名 来切换工作分支到该分支名
2.6.5 查看分支历史 –git-show-branch
    调用该命令可以查看分支历史变化情况。 如:
* [dev1] d2
! [master] m2
--
* [dev1] d2
* [dev1^] d1
* [dev1~2] d1
*+ [master] m2
    在上述例子中, "--"之上的两行表示有两个分支dev1和master, 且dev分支上最后一次提交的日志是"d2",master分支上最后一次提交的日志是"m2"。 "--"之下的几行表示了分支演化的历史,其中 dev1表示发生在dev分支上的最后一次提交,dev^表示发生在dev分支上的倒数第二次提交。dev1~2表示发生在dev分支上的倒数第三次提交。
2.6.6 合并分支 – git-merge
    git-merge的用法为:git-merge "some memo" 合并的目标分支 合并的来源分支。如:
    git-merge master dev1~2
    如果合并有冲突,git会由提示,当前,git-merge已经很少用了, 用git-pull来替代了。
    用法为:git-pull 合并的目标分支 合并的来源分支。 如git-pull . dev1^

2.7   远程获取一个git库 git-clone
    在2.1节提到过,如果你不是一个代码模块的发起者,也不会使用到git-init命令,而是更多的是使用git-clone。通过这个命令,你可以从远端完整获取一个git库,并可以通过一些命令和远端的git交互。
    基于git的代码管理的组织结构,往往形成一个树状结构,开发者一般从某个代码模块的管理者的git库通过git-clone取得开发环境,在本地迭代开发后,再提交给该模块的管理者,该模块的管理者检查这些提交并将代码合并到自己的库中,并向更高一级的代码管理者提交自己的模块代码。
    对于酷讯来说,公司会有一个中心的git库, 大家在开发时,都是从中心库git-clone获取最新代码。
git-clone的使用方法如下: git-clone [ssh://]username@ipaddr:path。 其中, "ssh://"可选,也有别的获取方式,如rsync。 Path是远端git的根路径,也叫repository。
    通过git-clone获取远端git库后,.git/config中的开发者信息不会被一起clone过来。仍然需要为.git/config文件添加开发者信息。此外,开发者还需要自己添加. gitignore文件
   另外,通过git-clone获取的远端git库,只包含了远端git库的当前工作分支。如果想获取其它分支信息,需要使用"git-branch –r" 来查看, 如果需要将远程的其它分支代码也获取过来,可以使用命令" git checkout -b 本地分支名 远程分支名",其中,远程分支名为git-branch –r所列出的分支名, 一般是诸如"origin/分支名"的样子。如果本地分支名已经存在, 则不需要"-b"参数。

2.8   从远程获取一个git分支 – git-pull
    与git-clone不同, git-pull可以从任意一个git库获取某个分支的内容。用法如下:
    git-pull username@ipaddr: 远端repository名 远端分支名:本地分支名。这条命令将从远端git库的远端分支名获取到本地git库的一个本地分支中。其中,如果不写本地分支名,则默认pull到本地当前分支。
需要注意的是,git-pull也可以用来合并分支。 和git-merge的作用相同。 因此,如果你的本地分支已经有内容,则git-pull会合并这些文件,如果有冲突会报警。

2.9   将本地分支内容提交到远端分支 – git-push
    git-push和git-pull正好想反,是将本地某个分支的内容提交到远端某个分支上。用法:
git-push username@ipaddr: 远端repository名 本地分支名:远端分支名。这条命令将本地git库的一个本地分支push到远端git库的远端分支名中。

    需要格外注意的是,git-push好像不会自动合并文件。这点我的试验表明是这样,但我不能确认是否是我用错了。因此,如果git-push时,发生了冲突,就会被后push的文件内容强行覆盖,而且没有什么提示。 这在合作开发时是很危险的事情。
2.10     库的逆转与恢复 – git-reset
    库的逆转与恢复除了用来进行一些废弃的研发代码的重置外,还有一个重要的作用。比如我们从远程clone了一个代码库,在本地开发后,准备提交回远程。但是本地代码库在开发时,有功能性的commit,也有出于备份目的的commit等等。总之,commit的日志中有大量无用log,我们并不想把这些log在提交回远程时也提交到库中。 因此,就要用到git-reset。
    Git-reset的概念比较复杂。它的命令形式:git-reset [--mixed | --soft | --hard] [<commit-ish>]
命令的选项:
--mixed
    这个是默认的选项。 如git-reset [--mixed] dev1^(dev1^的定义可以参见2.6.5)。它的作用仅是重置分支状态到dev1^, 但是却不改变任何工作文件的内容。即,从dev1^到dev1的所有文件变化都保留了,但是dev1^到dev1之间的所有commit日志都被清除了,而且,发生变化的文件内容也没有通过git-add标识,如果您要重新commit,还需要对变化的文件做一次git-add。 这样,commit后,就得到了一份非常干净的提交记录。
--soft
    相当于做了git-reset –mixed,后,又对变化的文件做了git-add。如果用了该选项, 就可以直接commit了。
--hard
    这个命令就会导致所有信息的回退, 包括文件内容。 一般只有在重置废弃代码时,才用它。 执行后,文件内容也无法恢复回来了。

2.11     更多的操作
    之前的10节只简要介绍了git的基本命令,更多的细节可以去linux下man git的文档。此外,http://www.linuxsir.org/main/doc/git/gittutorcn.htm 也有不少更详细的介绍。

3.   基于git的合作开发
对于酷讯来说,当我们采用了Git,如何进行合作开发呢? 具体步骤如下:
3.1   获取最新代码

    酷讯会准备一个中心git代码库。首先,我们将整理好的代码分模块在git中心库中建立git库。并将文件add到中心库中。 接下来,开发者通过git-clone将代码从中心库clone到本地开发环境。
对于较大的项目,我们还建议每个组选择一个负责人,由这个负责人负责从中心库获取和更新最新的代码,其它开发者从这个负责人的git代码库中clone代码。此时,对开发者来说,这个负责人的git库就是中心库了。

        

3.2 开发者在本地进行迭代开发

    当用户将代码clone到本地后, 就可以进行本地的迭代开发,建议用户不要在master分支上开发,而是建立一个开发分支进行开发。 在本地开发中,用户可以随意的创建临时分支,随意commit。

3.3   开发者请其它同事进行code review

    当本地开发完毕,可以请其它同事进行code review。过程为:
1. user2通通过git-pull命令,将开发者(user1)的开发分支(dev)pull到user2本地的一个tmp分支,并切换工作分支到该分支上进行code review。
2. 完成code review后, user2切换回其原有开发分支继续开发,并告知user1已经修改完毕。
3. User1将user2的tmp分支git-pull到本地tmp分支,并和dev分支进行merge。最终得到一个code review后的dev分支。
    当然,user2也可以直接坐在user1旁边在他的代码上进行review。而不需要走上述步骤。(图中第7步,不是git-pull,而是直接在dev分支上和user1边review边modify)

    



3.4   和中心库进行代码合并

    使用过CVS的人都知道, 在commit之前,都要做一次cvs update,以避免和中心库冲突。Git也是如此。
现在我们已经经过了code review, 准备向中心库提交变化了, 在开发的这段时间,也许中心库发生了变化, 因此,我们需要在向中心库提交前,再次将中心库的master分支git-pull到本地的master分支上。并且和dev分支做合并。最终,将合并的代码放入master分支。
    如果开发过程提交日志过多,可以考虑参照2.10节的介绍做一次git-reset。
    此外,如果发现合并过程变化非常多, 出于代码质量考虑,建议再做一次code review


3.5   提交代码到中心库

    此时,已经完全准备好提交最终的代码了。 通过git-push就可以了。


3.6   合作流程总结
    大家可以看到,使用git进行合作开发,这一过程和CVS有很多相似性,同时,增强了以下几个环节:
1.       开发者在本地进行迭代开发,可以经常的做commit操作且不会影响他人。 而且即使不在线也可以进行开发。只需要最后向中心库提交一次即可。
2.       大家都知道,如果CVS管理代码,由于我们会常常做commit操作。但是在commit之前cvs update时常会遇到将中心库上的其它最新代码checkout下来的情况,此时,一旦出现问题,就很难确认到底是自己开发的bug还是其它用户的代码带来了影响。 而使用git则避免了用户间的开发互相影响。
3.       更有利于在代码提交前做code review。 以往用cvs, 都是代码提交后才做code view。如果发生问题, 也无法避免服务器上有不好的代码。 但是用git, 真正向中心库commit前,都是在本地开发,可以方便的进行code review, 然后才提交到中心库。更有利于代码质量。而且, 大家应该可以感到,使用git的过程中,更容易对代码进行code review,因为影响因素更小。
4.       创建多分支,更容易在开发中进行多种工作,而使工作间不会互相影响。 比如user2对user1的代码进行code review时,就可以非常方便的保留当时的开发现场,并切换到user1的代码分支,在code review完毕后,也可以非常方便的切换会曾经被中断的工作现场。

    诚然,带来这些好处的同时,确实也使得操作比CVS复杂了一些。但我们觉得和前面所能获得的好处相比,这些麻烦是值得的。 当大家用惯了之后会发现,这并不增加多大的复杂性, 而且开发流程会更加自然。

    请大家多动手,多尝试! 去体验git的魅力所在吧!let's enjoy it!

    

Monday, July 20, 2009

News|熊猫烧香病毒制造者将出狱 想去大网络公司就业

熊猫烧香病毒制造者将出狱 想去大网络公司就业(图) -6park.com

熊猫烧香病毒制造者将出狱 想去大网络公司就业(图)

新闻来源: 人民网 于July 19, 2009 23:18:22 敬请注意:新闻取自各大新闻媒体,观点内容并不代表本网立场!

  2006年12月至2007年1月,那是一段中国网民遭遇浩劫的日子。 www.6park.com

  "黑客"出身的李俊研制病毒,碰上了擅长"病毒商业运作"的"生意人"王磊和张顺,两者在"暴利"诱惑下的结合,最终引发了"熊猫烧香"席卷网络的灾难。短短的两个多月时间,该病毒不断入侵个人电脑、感染门户网站、击溃数据系统,上千万台次的电脑遭到病毒攻击和破坏,给众多个人用户、网吧及企业局域网用户带来巨大的损失,被《2006年度中国大陆地区电脑病毒疫情和互联网安全报告》评为"毒王"。 www.6park.com

  从案发到现在,两年半过去了,猖獗的"熊猫烧香"病毒已经被消灭。该案3名案犯相继出狱,只有"毒王 "李俊仍在服刑改造。近日,本报记者经过辗转联系,先后与李俊、雷磊、张顺等3人首次面对面,他们讲述了鲜为人知的作案细节,真实地还原了"熊猫烧香"的诞生和灭亡过程,这也是他们首次直面媒体。 www.6park.com

  因"熊猫烧香"案获刑的李俊等人,被司法界称为中国第一批因制造电脑病毒获刑的人。但正如李俊所言,他们不是第一个制造病毒的人,也不是最后一个制造病毒的人。计算机病毒的泛滥,拷问着中国发展仅10余年的互联网安全,显示出国家的相关法律并不完善,在互联网安全的管理上,还有很长的路要走。 www.6park.com

  今年,因获减刑的李俊即将出狱,他表示,出狱后要改邪归正,他委托本报提前帮他联系一份网络公司的工作,他将投身于维护网络安全的战斗中。 www.6park.com

  6月29日,暴雨过后,湖北某监狱。雷磊拎着一袋零食,再次敲开了监狱的大门。记者陪同他看望正在服刑的李俊。 www.6park.com

  "最近怎么样?还好吧?"监狱会见室内,雷磊一阵寒暄,李俊嬉笑着脸,显得很精神。从邻居到同学,他们相互熟悉,最后因为"熊猫烧香"病毒案件,两人成为"患难"兄弟。 www.6park.com

  李俊称,他制作病毒之初,只是为了炫耀技术。简单心态的罪恶演变,源于认识擅长"病毒商业运作"的王磊和张顺。在"暴利"的诱惑下,他们的结合,最终引发一场中国网络灾难。 www.6park.com

   初衷为炫耀编程技术 尝试制作超级病毒 www.6park.com

  2005年9月,"黑客"出身的李俊,因没有正规的计算机专业学历,在广州、深圳屡屡碰壁,最终失望而归。为提高编程技术,他报名参加武汉某软件培训学校,学习"WEB"软件设计,直到2006年9月。 www.6park.com

  李俊觉得编程课太枯燥,选择了提前退学。之后的日子,他每天躲在关山关南小区的出租屋内玩电脑,和网友交流编程心得。一天,他所在的编程爱好者群里,一个网友突然问李俊,"我的电脑又中毒了,你可不可以做一个差不多的病毒出来?" www.6park.com

  网友的试问,引起了李俊的兴趣,"自己的电脑也经常中病毒,但我还从来没有做过病毒。"李俊决定尝试一下,看看自己到底有多大的编程水平。"我试一下。"李俊给了网友一个不太肯定的答复。 www.6park.com

  李俊说,其实,他对病毒还是有一定的了解。2003年至2004年间,雷磊以"whboy"的名义做过"QQ尾巴"病毒,他对制作病毒的基本流程是非常清楚的。 www.6park.com

  "以往的病毒,是通过人为传播的,我制作的病毒必须是自动传播。"李俊在设计病毒之初,就想让别人不仅知道电脑中毒,还要知道中了什么毒。李俊说,他制作病毒的目的就是想炫耀自己的技术,看自己的编程到底达到什么水平。在网上,他选中一个可爱的"熊猫烧香拜佛"图标作为病毒标志。 www.6park.com

  雷磊说,这一段时间内,李俊不断向他请教,在编程上如何实现某种功能,他一一作了回答。但是,雷磊压根就不知道,李俊正在制作的是一个超级病毒。

  试毒病毒完成后反复试验杀伤力
www.6park.com

  大约两个月后,也就是2006年11月,李俊基本完成了"熊猫烧香"病毒。在编写病毒的日子里,除了吃饭、睡觉,其余时间他就坐在电脑前查资料,编写代码。 www.6park.com

  雷磊说,李俊大部分是模仿"尼姆达"病毒编写 "熊猫烧香"。李俊说,"熊猫烧香"是经过多种途径交叉感染的超级病毒,它可通过U盘、局域网感染,也可通过点击网页感染,总之,现今病毒感染的所有方式,"熊猫烧香"都具备了。 www.6park.com

  为验证自己的病毒是否真正具有杀伤力,他将这个编好的病毒,放在自己的电脑里进行了试验。李俊称,尽管自己的电脑中毒,删除了部分系统文件,但他还是觉得效果只是一般。"熊猫烧香让千万台次电脑中毒,你觉得效果只是一般?"对于记者的疑问,李俊只是淡淡一笑,"熊猫烧香病毒的危害本来就很一般,只不过它的感染方式有些厉害。" www.6park.com

  李俊当了多年的"黑客",攻击过无数网站,但制作病毒,还是头一回。试验成功后,他很兴奋,在编程爱好者群里"大吼":"我做好了一个病毒,谁想要的话,可以给你看。"在李俊看来,他有了一个让他值得炫耀的本钱。 www.6park.com

  随后,李俊将这个病毒送给几个网友分享,并和他们展开探讨。 www.6park.com

  转变月入40万 病毒带来的暴利让人疯狂 www.6park.com

  李俊制作病毒目的的转变,从认识王磊开始。 www.6park.com

  对于和李俊的关系,王磊始终不愿再提,他称自己只想过一段平淡的生活。李俊说,他最开始还不知道病毒可以卖钱。 www.6park.com

  2006年12月底,一名网友向李俊介绍,"王磊需要获得流量挂木马。"随后,王磊通过QQ加李俊为好友,并问道:"你是不是有一个病毒?我帮你卖钱。"李俊说,他头一次听说病毒还可以卖钱。"卖就卖吧,无所谓。"李俊觉得好玩,他没有意识到自己开始滑向犯罪的深渊。 www.6park.com

  张顺和王磊没有什么电脑技术水平,但却都是很有"生意头脑"的人。张顺说,他不懂电脑技术,但懂得如何利用黑客和病毒赚钱。每天,张顺不断在网上寻找黑客和病毒,然后将自己买来的木马程序,挂在病毒上盗号搞钱。 www.6park.com

  在认识李俊之前,张顺一直和王磊合作,找他要流量挂盗号木马。2006年年底,王磊告诉张顺,他和一个人合作搞了个病毒,有很多流量,并借此要求提高获利提成。张顺将盗号木马给王磊后,每日可收到10多万个游戏信封,日赚数万元。 www.6park.com

  从12月底到1月20日之间,李俊的银行账户里每天日进斗金。李俊说,"每天账户都会打进3000到5000元,最高时有1万多元进账。"在一个多月的时间里,李俊账户里的资金曾高达40多万元。 www.6park.com

  王磊帮忙销售病毒的时候,李俊感觉到王磊从中赚走了很多钱。于是,他通过QQ聊天记录发现,王磊可能是在和群里的网友张顺联系。李俊的猜测得到证实。李俊决定撇开王磊,直接与张顺合作,那样赚的钱会多一些。 www.6park.com

  雷磊说,钱来得太容易,那段日子他和李俊过得很奢侈,"吃最好的东西,住最好的宾馆"。 平时,李俊喜欢白天睡觉,晚上上网,一般不出去玩,但他见起网友来,出手非常大方,经常飞机来飞机去,最多一天消费上万元。 www.6park.com

    灾难病毒一个月击溃千万台次电脑 www.6park.com

  2006年12月底开始,"熊猫烧香"病毒以闪电的速度,在全国网络间传播。李俊说,"每天,熊猫烧香病毒可获取30万到50万的电脑流量,也就是说,全国每天有30万到50万的电脑系统被击溃,若按一个月算的话,全国至少1000万台次电脑遭到了熊猫烧香病毒的攻击和破坏。" www.6park.com

  尽管这样,李俊并没有觉得事情很大。李俊说,全国的媒体疯狂报道"熊猫烧香"时,一种从未有过的快感从他心头涌起,"看到很多公司手忙脚乱的时候,我觉得特别好玩,感觉很好笑"。 www.6park.com

  媒体的报道,满足了李俊的虚荣心。到了后来,李俊的"野心"膨胀,他要与国内主要杀毒软件公司进行较量,让杀毒软件公司发布"熊猫烧香"病毒公告,那样我才觉得好玩。"据了解,就在熊猫烧香病毒肆虐时,李俊曾不断更新病毒,在网上与瑞星公司进行较量,直至被捕。 www.6park.com

  2007年1月,媒体报道病毒的始作俑者可能就是"whboy"。雷磊这才发现李俊制作了"熊猫烧香 "病毒。媒体的集中关注,让李俊有些紧张,他找到雷磊称"出了点事",随后将事情经过告诉了雷磊。雷磊看了病毒说,"电脑一中毒,程序就变熊猫,傻冒都知道。"雷磊提出要隐藏"熊猫烧香"图标。就在实现这一目标的过程中,2007年2月3日,他们被公安机关抓获。 www.6park.com

   悔过曾想将杀毒软件作新年礼物送网友 www.6park.com

  病毒的蔓延和肆虐,全国各大门户网站相继重点报道"熊猫烧香"案,李俊这才意识到事情的严重性。"当时,我并不知道警方在通缉我,只是觉得事情闹大了。"2007年2月1日,李俊在网上跟王磊说:"不搞了,事情严重了。"与此同时,张顺也收到了李俊的警告:"公安机关和网监可能盯上了我们,小心点。 " www.6park.com

  李俊越发担心,他不停地问雷磊该怎么办,雷磊建议,立即关闭所有的病毒网站,写好杀毒软件和道歉信。 www.6park.com

  2007年2月2日,在武昌大东门一家宾馆,李俊和雷磊只用了一天,就编写好了杀毒软件和道歉信。李俊说,他准备在除夕之夜,将"熊猫烧香"专杀工具及道歉信挂在网上,送给全国网友一个新年礼物。然而,这个礼物尚未送出去,次日他就被仙桃警方抓获。李俊说,他编写的这个杀毒工具,可杀所有的"熊猫烧香 "及其变种病毒。 www.6park.com

  李俊说,"熊猫烧香"病毒给网友造成巨大的损失,虽然无法赔偿损失,但起码可以道歉。他原以为,他的道歉能得到社会的谅解。但是法律是威严的,他最终被判刑4年。 www.6park.com

   名词解释 "熊猫烧香"病毒 www.6park.com

  是一种蠕虫病毒的变种,而且是经过多次变种而来的。 www.6park.com

  尼姆亚变种W(Worm.Nimaya.w),由于中毒电脑的可执行文件会出现"熊猫烧香"图案,所以也被称为"熊猫烧香"病毒。 www.6park.com

  用户电脑中毒后可能会出现蓝屏、频繁重启以及系统硬盘中数据文件被破坏等现象。同时,该病毒的某些变种可通过局域网进行传播,进而感染局域网内所有计算机系统,最终导致企业局域网瘫痪,无法正常使用,它能感染系统中exe、com、pif、src、 html、asp等文件,它还能中止大量的反病毒软件进程并且会删除扩展名为gho的文件。被感染的用户系统中所有.exe可执行文件全部被改成熊猫举着三根香的模样。 www.6park.com

   出狱后期望就业于大型网络公司 www.6park.com

  6月30日上午9时许,暴雨过后。湖北某监狱大门前的水泥路,积水已淹没至膝盖。"嘎吱"一声,沉重的铁门缓缓打开。 www.6park.com

  在狱警的带领下,记者穿过两重铁门进入监狱办公楼。李俊很忙,他正在维修监狱的一台电脑。一名狱警开玩笑说,李俊是监狱里的电脑"医生",只要电脑出现了问题,他一摆弄就好了,"我们恨不得他50年都不出去"。 www.6park.com

  他穿着花短裤、短袖T恤、拖鞋,很腼腆。从水泥厂工人到全国关注的"毒王",再到囚犯,李俊的人生犹如坐过山车一样。"当媒体大量报道'熊猫烧香'病毒时,我都没有想到我会进监狱,当时只是觉得把事情搞大了。" www.6park.com

  2007年2月3日,他被抓了。那年,他才25岁,从未想过自己的人生轨迹会与监狱有过交集。"刚开始的时间,我常常躲在被子里哭,日夜地在想自己的经历,想自己的未来……想的东西很多,人都快疯掉了。" www.6park.com

  两年来,狱警的特别关照,对于监狱里的生活,李俊说,虽有些艰苦,但已适应。鉴于李俊各方面的表现,司法部门已经为其减刑一年多。李俊掐着指头算,"还有5个月就可以出狱了。"李俊望了望窗外的天空。他渴望自由。 www.6park.com

    把读高中的机会让给弟弟 www.6park.com

  李俊的父母是阳逻娲石水泥厂的退休职工,家中有两个儿子,李俊是老大。因生活拮据,父亲仍在外地打工,母亲在阳逻街头做清洁工。 www.6park.com

  在母亲的眼里,李俊是一个老实的孩子,从不和别人打架。但李俊却很聪明,很小的时候,喜欢拆些旧收音机和旧手表之类的东西,拆完了再装好。 www.6park.com

  原本,李俊的中考成绩不错,考上了高中,但是因为家里穷,只能供一个孩子上学。父母只能做李俊的工作,让他给弟弟让出读高中的机会。李俊和父母达成了协议,给他买一台电脑,他放弃读高中,转读娲石水泥厂的中专。 www.6park.com

  水泥厂的一名负责人介绍,李俊的话不多,从不偷懒,是一个老实的工人。在母亲看来,儿子坐牢,归因于没有上大学,"我很后悔,当初没让李俊上大学,不懂法最终让他出了事。" www.6park.com

   黑客生涯源于中美黑客大战 www.6park.com

  1997年,从新洲阳逻镇娲石水泥厂街出现第一家网吧开始,李俊就是那里的常客。"刚开始的时候,我主要是玩游戏,一呆就是一天。" www.6park.com

  对于网络的深入,始于1998年。那一年,中国驻南联盟大使馆被炸,引发了中美黑客大战。李俊在邻居兼同学雷磊的带领下,第一次接触了"黑客"。 www.6park.com

  李俊说,1998年,雷磊早已是黑客论坛"小刀会"的会员。他经常在论坛里玩。有一次,他在网吧里看到雷磊在黑客论坛里听课,觉得很好奇。在雷磊的指导下,他第一次接触到了神奇的"黑客世界"。 www.6park.com

  经雷磊介绍,李俊也加入"小刀会"。他说,接触黑客软件后,他对电脑游戏不再感兴趣,而是成天在"小刀会"上课,逛黑客论坛,学习、研究一些黑客技术。 www.6park.com

  "攻击别人的网站,我没有搞过破坏,只是觉得这样做很有成就感,很刺激。"李俊的善意提醒,也让他结交了很多"网管"。他说,"长江数据"的一个网管,经常向他请教问题。"有时候,有网管会请我过去做安全维护,这样我还可以赚些生活费。" www.6park.com

  出狱后想就业于大网络公司 www.6park.com

  "犯得了罪,就要坐得了牢。"李俊很淡定。他说,自己造成这么大的损失,获刑是应当的处罚。 www.6park.com

  原以为,自己在网上的所有行为,不会有事,但最终还是触犯了法律。他提醒所有的网友,虚拟的世界终归回归现实,在网络上干了不该干的事情,一样要受到法律的制裁。 www.6park.com

  李俊说,今年,因盗窃搜狐游戏币的付强被法院判处10年有期徒刑。付强曾是李俊的好朋友,2007年,还曾去仙桃看守所看望过他,但没有想到付强也进了监狱。 www.6park.com

  对于将来,李俊很彷徨,"我现在想的,不一定能在未来实现。"李俊说,还有5个月,他就可以出狱了,还是希望再到深圳去闯一闯,进大网络公司做网络安全维护。不过,李俊说,能留在武汉最好,对于薪水,他没有太高的期望,只要能发挥他的长处就行。 www.6park.com

  李俊特别地自我介绍一番,"我对windows的技术病毒很了解,擅长于对病毒攻击的防护和反追踪。" www.6park.com

  对于母亲,他很愧疚。"我希望找到工作后,好好报答我的父母。" www.6park.com

  人物档案 www.6park.com

  李俊 今年27岁,新洲阳逻人,水泥厂中专学校毕业。先后在阳逻娲石水泥厂、洪山广埠屯电脑城、网吧打工。2006年10月,制作"熊猫烧香"病毒,获刑4年。目前,正在监狱服刑。李俊及该案中的另外3名获刑者,成为中国第一批因制造病毒获刑的人。 www.6park.com

  刚进监狱时,我常常躲在被子里哭,日夜想自己的经历,想自己的未来……想的东西很多,人都快疯掉了。 www.6park.com

  虚拟的世界终归回归现实,在网络上干了不该干的事情,一样要受到法律的制裁。 www.6park.com

  ――李俊 www.6park.com

  我很后悔,当初没让李俊上大学,不懂法最终让他出了事。

News|网上现《专家速成手册》 做专家只需记住6点

网上现《专家速成手册》 做专家只需记住6点(图) -6park.com

网上现《专家速成手册》 做专家只需记住6点(图)

新闻来源: 河南商报 于July 19, 2009 23:08:06 敬请注意:新闻取自各大新闻媒体,观点内容并不代表本网立场!


核心提示:近日,有网友在论坛贴出《专家速成手册》,发帖者从中总结出六个特征,称只要做到这六点,人人可做"专家"。比如遇到问题就说"这很正常",或者说"这是中国特色"。 www.6park.com

近日,有网友在论坛贴出《专家速成手册》,发帖者从中总结出六个特征,称只要做到这六点,人人可做"专家",网友称其"很创意,很讽刺"。 www.6park.com

帖子 www.6park.com

做到六点,人人都能成"专家" www.6park.com

昨日,记者在大河论坛发现一篇名为"专家速成手册" 的帖子。 www.6park.com

网帖称,《专家速成手册》(下简称手册)是总结了众多专家的言行举止后归纳出来的。发帖者"苏面条"称,只要按照"手册"中的六点去做,人人都可成为专家。 www.6park.com

www.6park.com

"遇到问题就说'这很正常'。""苏面条"说,这样做除了能显示自己见多识广,还能说明别人少见多怪。同时,帖中还提到了"差异性",即在与正常人交谈时,见解要和别人有所区别。"这样才能显示专家的不落窠臼。" www.6park.com

此外,该帖对"条理性"也有分析。"就算是一个原因,你也要分出一二三四来,这样做,才能显示你对问题确实有研究,不愧对专家的称号。""苏面条"说。 www.6park.com

该帖同时指出,做到以上三点只是基本,要成为"专家",还得懂得运用"绝招"和"秘诀"。 www.6park.com

所谓绝招,就是凡事都与国际接轨。"事事都可以套用跟国际接轨这个说法,这既体现言论的先进性又好糊弄人"。 www.6park.com

"说别人听不懂的话,套用大话空话,运用打太极的手法与人周旋。"发帖者称,如此发言是永远不会出错的秘诀。 www.6park.com

反应 www.6park.com

网友借"手册"调侃专家 www.6park.com

网友"火星"称,"手册"很有创意,也很讽刺。"以前我连话都说不流利,有了《专家速成手册》后,我腰也不疼了,腿也不酸了,走路也有劲了,说话也大声了。" www.6park.com

网友"鱼在路上走"跟帖:"曾经心中学问、权威、偶像的代表,为何会被恶搞,还搞得有理有据?" www.6park.com

有网友评论称,专家之所以成为恶搞对象,原因是专家形象被滥用。"在某些虚假广告中,动不动就搬出所谓的专家说事,大众对专家的信任度开始逐步下滑。" www.6park.com

网友"拍你是爱护你"认为,某些专家的"雷人"语录也是专家被调侃的原因之一。 www.6park.com

"拍你是爱护你"发帖称,2008年2月18日,广州市卫生局副局长曾其毅曾说:所谓看病难看病贵,我走遍全世界,看病最不难是中国,看病最不贵是中国。"其实在中国看病并不贵,是人们的价值观念问题"。 www.6park.com

说法 www.6park.com

专家最好不要随意发表看法 www.6park.com

昨日下午,郑州大学教授纪德尚接受记者采访,对"专家速成手册"和"专家言语"问题提出了自己的看法。 www.6park.com

纪教授指出,专家是不可能速成的。"之所以称之为专家,就是拥有专业知识和技能,在某个领域经过多年研究,对该领域有突出贡献的人。" www.6park.com

纪教授认为,"专家速成手册"反映出一些人利用帖子赚取点击率和个人利益,有哗众取宠之嫌,不可信。他同时指出,"手册"的出现也说明网友对专家很关注。 www.6park.com

"专家在话语权上处于强势地位,不排除少数专家与利益集团结成某种共同体。"纪教授说,专家应规范用语,增强公信力和社会责任感。 www.6park.com

郑州大学新闻学院博士詹绪武称,公众对专业知识是有需求的,专家在解释专业知识,发表专业言论时要有自知之明,对不了解的领域不要随意谈看法。"专家言论应客观、公正,不然会误导公众。" www.6park.com

以下为帖子原文: www.6park.com

一、遇到什么问题都说:这很正常 www.6park.com

不管别人提什么千奇百怪的问题,你都要回答:"这很正常。"这样做的好处是,既说明了自己见多识广,又能说明别人少见多怪,从而确立自己的专家地位。例如:有人问"为什么汶川地震,我们国家的地震局,没有任何的预测?"你可以说:"这很正常,地震预测是世界性难题。"有人问:"为什么地震中学校的校舍倒塌的那么多。"你可以说:"这很正常,地震的强度超过八级,所有的房屋都有倒塌的可能。"有人问:"为什么中国足球,搞了这么多年改革,现在连伊拉克都踢不过?"你可以说:"这很正常,因为足球比赛中有很多不确定因素。"有人问:"你为什么老是说这很正常?"你可以说:"这很正常,因为我是专家。" www.6park.com

二、与正常人的见解有区别 www.6park.com

专家之所以称为专家,就是要见人所未见,言人所未言。例如:有人说:"物价涨的太厉害了。"你要说:"不是物价涨,是中国的东西太便宜。"有人说:"股市跌得太厉害了,政府应该救市"你要说:"不行,要坚持中国股市的自由市场经济地位,避免政府对股市的干预。"有人说:"CPI增长了8.4%,活不了了。" 你要说:"这样的物价水平,大多数人都能接受。"有人说:"中国专家不懂,一天到晚就知道吃饭。"你要说:"有时候我们也吃屎。" www.6park.com

三、分点论述 www.6park.com

分析问题原因的时候,要分出一二三四。这一点很重要,就算是一个原因,你也要分出一二三四来,这样做,才能显示你对问题确实有研究,不愧对专家的称号。如果说一二三四的同时,你还遵循了先世界后中国的顺序,那么你就可以成为中国的著名专家了。例如,你可以说:"我分析汶川地震中校舍大量倒塌主要有三个原因:一从世界范围上来说,都存在地震中校舍倒塌的问题。例如美国……二是校舍倒塌,主要是因为地震的强度比较大。三校舍倒塌,也存在建筑不合格的可能。"你还可以说:"我分析这次发改委提高油价有三个原因:一主要是受国际上油价上涨的影响。二人民群众对柴油的求量增加。三石油生产企业的供应量减少。"你甚至可以说:"我分析专家的可信度降低有三个原因:一从世界范围来看,专家的预测通常都不太准确。二人民群众的智商明显提高。三有些个别专家是猪,戴了个帽子,伪装成人类。" www.6park.com

四、说别人听不懂的话 www.6park.com

要说那些别人听不懂或者听完之后就迷糊的话,而且自己懂不懂没关系。例如有人问:"中国平安为什么会推出如此庞大的融资计划?"你可以说:"股市最重要的功能之一就是再融资,从经济学的角度讲#¥……。"有人问:"你觉得中国楼价这么高正常吗?"你可以说:"我们必须一分为二的看问题,虽然从某个角度来说,不正常,但是从社会学上来讲……"有人问:"为什么听完您的讲话,我有点困。"你可以说:"恭喜你,你听懂了!" www.6park.com

五、有大局观念并顾左右而言他 www.6park.com

有两个最重要的原则,是保证你成为专家之后能在国家媒体上保持上镜率的关键:一要有大局观念。例如,你可以说:"虽然我们的法制法规还不太完善,但是目前我们国家在这一方面已经有了长足的发展……"你还可以说:"虽然地震不可预测,但是我们国家对于地震的科研工作还是相当的重视……"你甚至可以说:"虽然中国的专家都是猪,但是我们国家在饲料中添加了许多提高智商的添加剂……"二善于顾左右而言他。例如,你可以说:"对于你提到中国看病难的问题,美国也存在这样的问题。我记得德克萨斯州1932年……"你可以说:"警察打人这样的事,只是警察队伍中个别人的个别问题,日本也有这样的情况,我记得在东京 1625年……" www.6park.com

六、杀手锏:与国际接轨 www.6park.com

最后这招,是大家都熟悉的绝招了,那就是:与世界接轨和中国特色。因为这是绝招,大家又是耳熟能详,所以在此,不再赘述。只举一例:有人问:"中国专家为什么工资这么高?"你可答:"与世界专家接轨。"有人问:"为什么别的国家的专家都是人,中国的却是猪?"你可答:"中国特色。" www.6park.com

综上所述,有此六技,则中国专家可成矣!

Sunday, July 19, 2009

Eclipse|Using Bookmarks in Eclipse

Sandarenu's Blog: Using Bookmarks in Eclipse

When we are writing programs it is important to keep track of important locations in the code. Using Bookmarks are the easiest way to do it. But in Eclipse that feature is some what hidden. By default there is no shortcut for that as well.

To add a Bookmark chose the code fragment you want to bookmark and from Edit menu select Add Bookmark. Once the bookmark is added there will be a small blue rectangle in the left hand side of the code window and a green rectangle in right had side of the code window. To view all the bookmarks that you added you have to bring in the Bookmarks view. Select Window > Show View > Other… from the main menu. Type "bookmark" in the filter box of the Show View Dialog box and select Bookmarks view.

Eclipse Show Views

 Eclipse Bookmarks Vie

To make the process of adding bookmarks easy you can create a shortcut key combination for it. To do that choose Window > Preferences from the main menu, which brings up the Preferences dialog. Then type in "key" in the filter box, which takes you to General>Keys. Then selects the Modify tab. Select "Edit" from the Category drop-down. Then choose "Add Bookmark" from the Name drop-down. Then click in the Key Sequence > Name text box. Then hold down the keys you want to use for your keyboard shortcut. I selected Alt+B for this. You can selects any unassigned key combination for this. Finally click Add.

Now you can use this shortcut to add bookmarks very easily. Cool isn't it?.......