##language:zh ##OBP项目图书reST通用文章模板 #format rst ==================== Mercurial 学习笔记 ==================== :作者: 胡玉新 .. contents:: 目录 :depth: 2 .. sectnum:: :depth: 2 Mercurial 一览: 基础 ==================== 安装 ---- Linux ~~~~~ Debian/Ubuntu:: apt-get install mercurial Fedora Core:: yum install mercurial Gentoo:: emerge mercurial ... Windows ~~~~~~~ 下载并安装。 开始 ---- 检查安装是否成功:: hg version 查看帮助:: hg help init 代码仓库 -------- 代码仓库不过是普通一个目录树。 获取代码库的本地拷贝 ~~~~~~~~~~~~~~~~~~~~ :: hg clone http://hg.serpentine.com/tutorial/hello 查看日志 ~~~~~~~~ :: hg log hg log -r 3 # 指定修订号 hg log -r ff5d7b70a2a9 # changeset identifier hg log -r 1 -r 4 # 指定多个修订号 hg log -r 1:3 # 指定修订号范围 hg log -r 3:1 # 修改 log 的输出顺序 获取更多信息 ~~~~~~~~~~~~ 显示详细信息(-v, --verbose):: hg log -v -r 3 显示修改内容(-p, --patch):: hg log -v -p -r 2 修改和查看修改 -------------- 用 hg clone 隔离我们的自己修改,值得说明的是:本地克隆不仅速度快,而且通常占用更小的磁盘空间:: $ cd .. $ hg clone hello my-hello $ cd my-hello .. note:: 一般情况下,最好保持远程代码库的一个原始拷贝,你可以从这里克隆多个副本进行修改,各个副本之间互相隔离。 查看修改:: $ hg status $ hg diff 提交修改 -------- 设置用户名 ~~~~~~~~~~ 修改配置文件:: [ui] username = Your Name<Your Email Address> linux ````` 编辑 .hgrc, 按照前面的说明修改。 Windows ``````` 编辑 %USERPROFILE%\Mercurial.ini。 如何找到 %USERPROFILE%: * 打开命令行, 缺省的目录通常就是 %USERPROFILE%, 或者用 ECHO %USERPROFILE% 查看 * 也可以在打开文件的对话框中直接输入 %USERPROFILE%\Mercurial.ini Mercurial 尝试用户名的顺序 `````````````````````````` #. hg commit -u "用户名" #. HGUSER 环境变量 #. ~/.hgrc 中的 usernamme #. EMAIL 环境变量 #. 本地用户名 + 主机名 提交信息 ~~~~~~~~ 由于 hg log 只显示提交信息的第一行,因此最好第一行写得完整、独立。 查看刚才的提交 ~~~~~~~~~~~~~~ :: hg tip -vp 共享修改 -------- 从其他代码库获取修改 ~~~~~~~~~~~~~~~~~~~~ 查看其他代码库做了那些修改:: hg incomming ../my-hello 获取代码库的修改:: hg pull ../my-hello 更新工作目录 ~~~~~~~~~~~~ hg pull 更新了代码库,如果要更新工作目录,还需要执行:: hg update hg pull 的 -u 参数可以获取代码库的修改的同时更新工作目录:: hg pull -u ../my-hello 更新到指定修订版:: hg update 2 [?]查看 parents 修订版:: hg parents 把修改发布到其他代码库 ~~~~~~~~~~~~~~~~~~~~~~ 查看本地代码库做了那些修改:: hg outgoing ../my-hello 发布代码库的修改:: hg push ../my-hello 通过网络共享修改 ~~~~~~~~~~~~~~~~ :: hg outgoing http://hg.serpentine.com/tutorial/hello hg push http://hg.serpentine.com/tutorial/hello Mercurial 一览: 合并修改 ======================== 合并 ---- 合并步骤,注意查看后面的说明:: hg pull ../my-hello # 现在代码库有多个 heads hg heads # 查看代码库的 heads #! hg update # 失败! 无法更新工作目录 #! hg update -C # 强制更新! 会丢失本地修改 hg merge # 合并修改 hg parents # 可以看到多个 parents hg commit -m 'Merged changes' # 提交合并结果 合并冲突 -------- 幕后 ==== 和许多版本控制系统不同, Mercurial 的基础概念简单到很容易理解软件是如何工作的。 Mercurial 的历史记录 -------------------- 跟踪单个文件的历史 ~~~~~~~~~~~~~~~~~~ Mercurial 把文件保存在文件日志中,文件日志保存在 .hg/store/data 目录。 对于大文件来说,文件日志保存在两个文件中 .d (数据)文件 和 .i (索引)文件, 对于小文件来说只需要一个 .i 文件。 安全高效的存储 ~~~~~~~~~~~~~~ 高效存储 ```````` 采用增量机制。 安全操作 ```````` Mercurial 只在文件末尾增加数据。另外 Mercurial 把每次写操作作为事务的一部分,保证操作的原子性。 快速读取 ```````` 采用索引文件。 修订历史、分支、合并 -------------------- <略> 工作目录 -------- 工作目录保存代码库的一个快照。 Mercurial 常用用法 ================== 添加文件 -------- :: hg init add-example cd add-example echo a > a hg status hg add a hg commit -m 'Added one file' hg status Mercurial 跟踪的是文件,不是目录 -------------------------------- Mercurial 跟踪的是文件,不是目录, 因此无法添加一个空目录, 需要空目录时有下面两个方法。 方法一: 添加一个隐含文件:: mkdir empty touch empty/.hidden hg add empty 方法二: 不要跟踪空目录,要空目录干嘛?需要时自己创建一个得了。 停止跟踪文件 ------------ :: hg remove hg remove --force # 移除已修改/刚添加的文件 hg remove --after # 文件已经删除时,可以用 方便的添加/移除文件命令 ----------------------- 添加未添加的文件,移除已经删除的文件:: hg addremove 拷贝文件 -------- 太麻烦了,不用也罢。 重命名文件 ---------- 重命名文件使用拷贝文件的方式实现的,相当于拷贝文件并并删除原文件。 重命名也是比较麻烦的, 因此也要少用。 撤销提交 -------- :: hg revert 协同工作 ======== Mercurial Web 接口 ------------------ 简单服务器:: hg serve -p 8080 协作模型 -------- 有了合适的工具后, 采用何种工作流是一个文化问题而不是技术问题。 Mercurial 没有太多限制工作流, 因此需要你和你的工作组来确定适合你们自己需要的工作流。 需要考虑的因素 ~~~~~~~~~~~~~~ ... 发布管理和分支管理 ================== :: hg tag v1.0 hg tag -r 1 v1.1 hg tag -f -r 2 v1.1 hg log -r v1.0 hg tag --remove v1.1 hg tag -r 3 -l 1.1.1 # 本地 tag 分支示例:: myproject myproject-1.0 myproject-1.0.1 myproject-1.0.1-bugfix myproject-new-feature 合并示例:: hg pull ../myproject-new-feature hg merge hg commit -m 'Merge bugfix from 1.0.1 branch' hg push 发现和改正错误 ============== 取消上次提交 ------------ :: hg rollback 取消错误的 pull --------------- :: hg rollback rollback 的限制 --------------- * 一旦 push 后, rollback 就没用了 * 只能 rollback 一次 hg revert --------- 示例:: hg revert foo # 放弃对 foo 的修改 hg add bar # 错误添加了文件 bar hg revert bar # 取消添加 hg remove file # 错误删除了文件 file hg revert file # 好的,恢复了 rm file # 错了,删错了 hg revert file # 好的,恢复了 hg copy file newfile # 错了 hg revert newfile # 改正就行了 hg rename file newfile # 错了 hg revert newfile # 知错就改 hg backout ---------- 复杂的应用 定制 Mercurial 的输出 ===================== :: hg log --style compact hg log --style changelog hg log --template 'I saw a changeset: {desc}\n' 常用关键字: * author * branches * date * desc * files * filet_adds 添加的文件列表 * filet_dels 删除的文件列表 * node * parents * rev * tags 应用实例 ======== 用 mercurial 管理你的系统 ------------------------- :: cd / sudo hg init sudo sh -c "echo -e 'syntax: glob\n*' > .hgignore" sudo chown -R xxx\: .hg .hgignore 其他 ==== FAQS ---- 查看信息 ~~~~~~~~ 如何知道当前使用的用户名 ```````````````````````` 查看当前用户名:: hg showconfig ui.username hg debugconfig ui.username # debugconfig -- alias of showconfig 查看工作目录的信息 `````````````````` :: hg parent # 查看工作目录的信息 hg id -n # 查看工作目录的修订版号 导出特定版本 ~~~~~~~~~~~~ :: hg archive -r ... 清空工作目录 ~~~~~~~~~~~~ :: hg update null backout ~~~~~~~ xs 配置文件 -------- 查看配置文件的帮助:: man hgrc 选项 ---- * -v, --verbose * -q, --quiet * -p, --patch * -r, --rev 中英文对照 ---------- ========================== ==================== ============== 英文 中文 说明 ========================== ==================== ============== repository 代码仓库 pull 获取 push 发布 ========================== ==================== ==============