我们现在在一些项目上已经开始使用 Git 来维护。关于 Git 的基本使用, @asce1885 的 技术周报 已经提供了一些学习资料。本文将收录一些有关 Git 和 Gitlab 的奇淫技巧,这些技巧可能不会收录在正统的教程中,但是却很实用。
本文是一篇维基贴,任何人都具有修改权限,欢迎其他同事继续补充。
个人比较倾向于直接使用 Git 的控制命令行工具,因为 Git 的命令足够简单,无需太多记忆负担,而且几个命令可以灵活实现各种复杂的版本控制工作,这是 GUI 客户端很难做到的。
如果还是更喜欢可视化工具,这里将推荐各种 IDE 、编辑器的 Git 插件和客户端。
Mac 下公认最优秀的可视化 Git 客户端 ,值得一提的是它还是免费的,业界良心有木有。只要你简单学习过 Git 的设计思路,加之以前对 CornerStone、TortoiseSVN 的使用经验,应该可以很快上手。
已经有童鞋上传到百宝箱,下载地址:http://10.20.18.148/desktop/index.php?share/file&user=ff&sid=yJqMAGYk7
首先需要 安装 Package Control3 。完成后 Cmd
+ Shift
+ p
打开 Command Plalette ,输入 install package
进入插件安装界面,再输入 git
,选择 git 插件并安装。安装完成后在 Tools 菜单上就可以找到 Git 插件,如下图所示:
此外,Git DiffHelper 插件提供了展示上一次更新以来代码的改动情况的工具。还有很多 Git 相关插件,读者可以自行尝试。
Atom 提供了和 Sublime Text 类似的 Git Plus 插件,可以在 Preference -> Install 里头安装。
Git Integration 插件提供了和上述插件类似的功能菜单,如下图所示:
Xcode 原生提供了对 Git 的支持。此外,还可以通过 Alcatraz 安装 GitDiff 插件,以展示上一次更新以来代码的改动情况。
好吧我承认这一节没几个人会看,不过 Emacs 下的 Magit 真的很好用。
Vim 同样也提供了非常实用的 Git 插件,安装配置方法如下:
版本控制最烦的事情就是合并代码了。虽然 Gitlab 的 Merge Request 已经减少了上游开发者合并代码的负担,但代码冲突依然是无可避免的。
Git 对于有冲突的代码会使用诸如 >>>>>>>
的特殊标记标出有冲突的部分,所以手动决定这些部分的去留是合并代码的一种做法。如果觉得实在太原始,那么可以借助其他合并工具来合并代码。这里介绍的是使用 Beyond Compare 作为 Diff 和合并工具的方法。
使用 Beyond Compare 合并代码的效果如下图,是不是非常直观?
百宝箱地址:http://10.20.18.148/desktop/index.php?share/file&user=ff&sid=eEdScVmh3
执行如下命令手动安装:
$ ln -s /Applications/Beyond\ Compare.app/Contents/MacOS/bcomp /usr/local/bin/bcompare
$ ln -s /Applications/Beyond\ Compare.app/Contents/MacOS/bcomp /usr/local/bin/bcomp
完成后测试在终端下执行 bcomp -h
,如果出现如下内容,说明安装成功。
终端执行:
$ git config --global diff.tool bc3
$ git config --global merge.tool bc3
$ git config --global mergetool.bc3 trustExitCode true
即完成配置。之后执行 git difftool
和 git mergetool
时将呼出 Beyond Compare 进行代码 Diff 和合并。
SourceTree 也可以配置 Beyond Compare 作为合并工具。打开 SourceTree 的设置界面,在 Diff 面板中设置如下:
Visual Diff Tool: Other
Diff Command:/usr/local/bin/bcomp
Arguments:-ro $LOCAL $REMOTE
Merge Tool: Other
Merge Command:/usr/local/bin/bcomp
Arguments:$LOCAL $REMOTE $BASE $MERGED
如果你跟我一样习惯直接使用命令来commit,那么当执行 git commit
时就需要借助编辑器来编写 Commit Message 。系统默认的编辑器是 Vi 。如果不喜欢 Vi ,可以修改为 Sublime Text 或者 Emacs 。这里介绍使用 Sublime Text 作为编辑器的方法。
首先需要把 Sublime Text 的命令行工具拷贝到可执行路径下:
$ cp /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/
然后确保 /usr/local/bin
是可执行路径,修改你的 shell 配置文件,将该路径添加进 PATH 里头:
export PATH=${PATH}:/usr/local/bin
完成后,重新开启一个终端,执行下 subl
,看看是否可以打开 Sublime Text 。
之后,执行如下命令,让 Git 将 Sublime Text 作为编辑器:
$ git config --global core.editor "subl -nw"
还在用 Bash ?奥特曼了。ZShell 是一个可扩展的 Shell 终端,其中 git 插件让 zsh 在 Git 仓库里自动展示当前分支。如下图所示:
赶紧抛弃 Bash 投奔到 ZShell 的怀抱吧。
Mac 安装 ZShell:
$ brew install zsh
完成后安装 oh-my-zsh :
$ brew install curl
$ curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
$ brew install wget
$ wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
之后修改 ~/.zshrc 文件中的 plugin
字段,为其添加 git 插件。例如:
plugins=(git autojump)
每次push代码都要输入密码太繁琐?使用 SSH 协议来维护代码可以实现免密码。
首先需要自己创建一对公私钥对:
$ ssh-keygen
一路回车,注意当提示输入 Enter passphrase 时直接回车。完成后在 ~/.ssh/ 目录下会生成 id_rsa 和 id_rsa.pub 两个文件,分别是私钥和公钥。
之后访问 http://10.20.11.218/profile/keys3 页面,点击 "Add SSH Key" 按钮。进入 SSH Key 添加页面。
之后打开 id_rsa.pub 文件,拷贝里头的内容,将其粘贴到 SSH Key 添加页面中的 key 一栏中。如下图所示:
title 一栏可以随便填。完成后点击 "Add Key" 确认。至此完成公钥的生成和添加。
接下来还需要将 SSH 的端口号映射为 8123 ,这是因为平安云禁止了默认的 SSH 端口。新建一个文件到 ~/.ssh/config 添加如下内容即可:
# 映射一个别名
host 10.20.11.218
port 8123
最后将项目的仓库地址由默认的 http 协议改为 ssh 协议:
$ git remote remove origin
$ git remote add origin git@10.20.11.218:[项目名].git
注意将 [项目名]
改为实际的项目名,例如 FFProject/App_Android
。完整的地址可以直接在每个仓库的主页里找到:
通过加钩子实现诸如风格检查、默认commit message的任务。下面的代码实现了在 git commit 时给出默认的 commit message 。
#!/bin/sh
BRIEF="[项目名][模块名][A|M|D][C:提交人][R:审查人] 简要描述"
DETAIL="另起一行补充说明(可选)"
ONE="- 可以使用这样的条目列举式。"
TWO="- 一般以单个空格紧跟短划线或者星号作为每项条目的起始符。每个条目间用一空行隔开。"
grep -qs "^$BRIEF" "$1" || echo "$BRIEF" >> "$1"
echo " " >> "$1"
grep -qs "^$DETAIL" "$1" || echo "$DETAIL" >> "$1"
echo " " >> "$1"
grep -qs "^$ONE" "$1" || echo "$ONE" >> "$1"
echo " " >> "$1"
grep -qs "^$TWO" "$1" || echo "$TWO" >> "$1"
将之保存到项目根目录下的 .git/hooks/prepare-commit-msg 中,并确保具有可执行权限。
sudo chmod +x prepare-commit-msg
之后,当 git commit
时就会出现如下的默认内容:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# modified: README.md
#
[项目名][模块名][A|M|D][C:提交人][R:审查人] 简要描述
另起一行补充说明(可选)
- 可以使用这样的条目列举式。
- 一般以单个空格紧跟短划线或者星号作为每项条目的起始符。每个条目间用一空行隔开。
Git 也有丰富的第三方插件,见 Awesome Git Addons 。举个栗子,git-ignore 插件可以通过 git ignore [文件名]
直接添加文件进 .gitignore 。git-cal 插件可以直接在终端生成格子:
参见 Awesome Git Tips2
试试我的 git-svn-transfer1 。
gitlab 默认显示的项目主页只展示了 README ,显得太单调:
如果希望像 Gitlab 那样同时展示文件列表,可以访问 preference设置页 修改默认展示内容为 files :
完成后再次进入项目主页,你会发现项目变成了类似 Github 上的样子,还是那个熟悉的味道~
想念 Github 上的格子?Gitlab 也有。点击左下角你的头像就可以访问你的个人统计页面。如下图所示:
期待有朝一日我们的 Gitlab 里出现像 Jake Wharton1 这样的码神: