1 ref:http://www.gentoo-cn.org/doc/zh_cn/git-howto.xml
9 注意: 请加上curl和tk USE标记。前者可以让你获取http协议的仓库,后者可以让你使用gitk工具。
14 $ emerge -av dev-util/git
22 然后设置msmtp,修改~/.msmtprc并设定权限:
24 代码 1.3: 修改~/.msmtprc并设定权限
29 tls_trust_file /etc/ssl/certs/ca-certificates.crt
32 from yourname@gmail.com
34 user yourname@gmail.com
38 $ chmod 600 ~/.msmtprc
40 请用你的email地址和密码代替上面的yourname@gmail.com和yourpassword。
48 ssmtp的配置文件分别存储在/etc/ssmtp/ssmtp.conf和/etc/ssmtp/revaliases内。
50 代码 1.5: 修改/etc/ssmtp/ssmtp.conf
52 root=yourname@gmail.com
53 mailhub=smtp.gmail.com:587
55 hostname=yourname@gmail.com
61 代码 1.6: 修改/etc/ssmtp/revaliases
63 root:yourname@gmail.com:smtp.gmail.com:587
64 user:yourname@gmail.com:smtp.gmail.com:587
66 请用你的email地址和密码代替上面的yourname@gmail.com和yourpassword,用你在的Gentoo Linux登录的用户名代替user。
70 安装好了smtp程序之后,我们来配置git本身。git的每个递交都会关联作者的email信息。在1.5.2.2版及以后的git中,可以使用git-config工具来设定git的一些全局变量。
72 代码 1.7: 设置自己的姓名、email地址及smtp服务器程序
74 $ git-config --global user.name 'Your Name'
75 $ git-config --global user.email 'yourname@gmail.com'
76 $ git-config --global sendemail.smtpserver "/usr/sbin/sendmail"
78 同样,用你自己的名字、email地址代替上面的Your Name和yourname@gmail.com。Gentoo里安装smtp服务器程序时都会附带安装一个/usr/sbin/sendmail符号连接,指向真正的smtp服务器程序可执行文件。所以直接把smtp服务器设定为此符号连接即可。
80 如此设置后,这些信息就会保存在~/.gitconfig文件中,作为用户个人的全局user相关设置。
84 开始工作前,首先在本地复制一个完整的主拷贝。
89 $ git clone http://www.gentoo-cn.org/git/gentoo-cn.git
91 命令成功以后,会创建一个gentoo-cn目录。里面的有个隐藏的.git目录,称为repository,包含了所有的历史数据。repository以外的其他文件称为工作拷贝(working copy),对其进行修改/删除不会影响repository的内容。Repository好比cvs/svn服务器中的内容,工作拷贝好比cvs /svn在客户端checkout出来的内容,可以随便修改。repository默认有一个分支(branch),叫master。当前分支的最新版本叫HEAD。和cvs/svn不同的是,基于git的开发是完全分布式的,没有一个集中的repository,任何开发者不但拥有工作拷贝,而且拥有所有的修改历史。这种开发方式给予开发者更多的信息和更大空间及自由度。
93 下一步请创建一个本地(local)分支并检出此分支。
98 $ git checkout -b local # 创建并检出分支
103 注意: 以后所有的修改都请只在本地分支里进行。
107 代码 1.10: 使用gitk --all可以通过图形方式查看项目的所有分支结构和历史修改
115 完成上述准备工作后,你就可以开始你的正式工作了。你可以修改现有的文件,也可以添加新文件或删除文件。我们以添加一个文件为例,来看看如何利用git进行管理。
119 $ echo "this is a test" > new_file.xml
123 你可以随时用git status和git diff查看目前的工作拷贝和repository HEAD的差别。
125 代码 2.2: 建立新文件后git status输出的结果
130 # (use "git add <file>..." to include in what will be committed)
133 nothing added to commit but untracked files present (use "git add" to track)
137 上述git status输出表明新文件new_file.xml还没有添加到repository。你可以用git add完成这个任务。对修改和删除的已有的文件不需要额外步骤。另外由于此文件是新加入的,现在使用git diff将不会显示任何结果。
141 $ git add new_file.xml
144 # Changes to be committed:
145 # (use "git reset HEAD <file>..." to unstage)
147 # new file: new_file.xml
154 你可以随时用git commit提交你的修改。刚开始使用git时,可以尽量多提交。因为和cvs/svn不同,这个拷贝是你个人的,你应该经常保存你的工作。你日后还可以对你的这些工作进一步整理,例如,合并多个提交结果,修改提交信息等,来形成最终可以发布到Gentoo China邮件列表的工作。
158 $ git commit -a -s -m "added a new file"
159 Created commit 96ffadde5682bc9b3d96582822bc4e75e8dccdca
160 1 files changed, 1 insertions(+), 0 deletions(-)
161 create mode 100644 new_file.xml
163 和cvs/svn一样,你需要填写一个描述此次修改的简短信息。对于自己使用的临时提交,信息可以比较随便。
165 用gitk或者git diff查看新的历史
169 $ git diff HEAD^..HEAD
170 diff --git a/new_file.xml b/new_file.xml
172 index 0000000..0527e6b
178 git diff HEAD可以查看工作拷贝和HEAD的差别。git diff HEAD^..HEAD用于查看最后一次提交所作的修改。HEAD^表示最新版HEAD的上一个版本。类似的名称还有:HEAD^^,HEAD~2,local^^^,tag_name,提交对应SHA1哈希的前几位(用gitk或git whatchanged可以查看提交对应的哈希值)等等。请查看man git-rev-parse以获取更多有关信息。
184 往往你需要对你的个人提交进行整理。尤其是当你想发布你的工作时,一般希望把之前的很多次提交集中起来。假设你还进行了如下的改动。
188 $ echo "this is the second line" >> new_file.xml
190 diff --git a/new_file.xml b/new_file.xml
191 index 90bfcb5..030e90b 100644
196 +this is the second line
197 $ git commit -a -s -m "some more log"
198 Created commit 1958506a599d1bcecd38fb4879b3483545226ef4
199 1 files changed, 1 insertions(+), 0 deletions(-)
200 $ git whatchanged HEAD^^..HEAD
201 commit 1958506a599d1bcecd38fb4879b3483545226ef4
202 Author: Xudong Guan <xudong.guan@gmail.com>
203 Date: Fri Jul 13 16:44:07 2007 +0100
207 :100644 100644 90bfcb5... 030e90b... M new_file.xml
209 commit 96ffadde5682bc9b3d96582822bc4e75e8dccdca
210 Author: Xudong Guan <xudong.guan@gmail.com>
211 Date: Fri Jul 13 16:28:08 2007 +0100
215 :000000 100644 0000000... 90bfcb5... A new_file.xml
217 此时你希望将上两次修改的commit合二为一,再发布,这时可以通过如下的步骤。
219 代码 4.2: 整理你的上两个提交为一个新的提交
221 $ git reset --soft HEAD^^ # 回退两个历史,但保留工作拷贝
225 # (use "git add <file>..." to include in what will be committed)
228 nothing added to commit but untracked files present (use "git add" to track)
229 $ git commit -a -m "Added new file new_file.xml
231 > 张兄,这是一个新添加的文件,他的用途主要是演示
237 此时你现在的local分支保存了一个整理好的提交。同时写了一个更加详细的提交描述。现在建议用gitk --all看看两个分支的可视化效果。
239 由于本次提交需要发布,所以最好按照如下格式填写你的提交描述。
243 Added new file new_file.xml
245 张兄,这是一个新添加的文件,他的用途主要是演示
250 信息中的第一行简要描述此次修改的主题,它同时也会是将来发送到邮件列表上时的邮件主题。第一行后请空一行,然后象写邮件正文一行,详细描述你的修改。描述使用中文或英文都可以,但是标题使用中文的话,git将来生成提交的patch邮件文件名时,会把中文过滤掉。
254 当你要发布你的工作时,你可以用git format-patch产生补丁并用git send-email将补丁发送到Gentoo China邮件列表(如果只是用于测试,可以发到一个个人的邮箱)。不过,与cvs/svn类似的是,补丁产生前之前应该先更新master分支,并且将本地分支rebase到master分支。rebase的概念类似于合并,但和git merge不完全一样。详情请查阅man git-rebase。
256 代码 4.4: 更新master分支且将本地分支rebase到master分支
258 $ git checkout master # 检出master
259 $ git pull # 更新master
260 $ git checkout local # 检出local
261 $ git rebase master # rebase到master
263 如果你在local分支的修改和master里的修改有冲突,这rebase就会中断,并且提示你哪个文件中发生了冲突以及你应该怎样做。此时你应该手工解决冲突,然后执行提示的命令。
267 $ vi new_file.xml # 解决文件中的冲突
268 $ git add new_file.xml # 标记为冲突已解决
269 $ git rebase --continue # 继续rebase
271 所有冲突解决完后,请用git format-patch自动生成要发布的邮件。
273 代码 4.6: 用git format-patch自动生成要发布的邮件
275 $ git format-patch master # 创建补丁
276 0001-Added-new-file-new_file.xml.patch
278 代码 4.7: 用git send-email发送邮件
280 $ git send-email 0001-Added-file-new_file_xml.patch --to gentoo-china@googlegroups.com
286 你的邮件发到列表上后,会有一定的反馈意见。你在听取修改意见后可以再次发布。你的发布可以被维护人员接收到主拷贝。其他开发者也可以不通过主拷贝,而是通过邮件直接获得你的工作(me是用来加上接收人的Sign-off行的)。
288 首先你需要把补丁邮件接收到本地,并保存邮件全文到一个文件,比如tmp.txt。然后你可以使用git am。
301 本文档的内容遵循知识共享-署名-相同方式共享许可协议
311 总结: 本文介绍了如何使用git来进行gentoo中文文档翻译工作的开发。本文的读者不需要有任何git基础。读完本文后,读者应该可以将自己的翻译或对现有工作的修改以补丁的形式发布到gentoo-china邮件列表上,供维护人员评阅和采纳。
334 Donate to support our development efforts.
335 Gentoo Centric Hosting: vr.org
347 Copyright 2001-2008 Gentoo Foundation, Inc. Questions, Comments? Contact us.