Git / Gitlab 奇淫技巧

来源:互联网 发布:奔奔数码淘宝王奔宏 编辑:程序博客网 时间:2024/04/30 19:09

我们现在在一些项目上已经开始使用 Git 来维护。关于 Git 的基本使用, @asce1885 的 技术周报 已经提供了一些学习资料。本文将收录一些有关 Git 和 Gitlab 的奇淫技巧,这些技巧可能不会收录在正统的教程中,但是却很实用。

本文是一篇维基贴,任何人都具有修改权限,欢迎其他同事继续补充。

Git 篇

Git 客户端

个人比较倾向于直接使用 Git 的控制命令行工具,因为 Git 的命令足够简单,无需太多记忆负担,而且几个命令可以灵活实现各种复杂的版本控制工作,这是 GUI 客户端很难做到的。

如果还是更喜欢可视化工具,这里将推荐各种 IDE 、编辑器的 Git 插件和客户端。

SourceTree

Mac 下公认最优秀的可视化 Git 客户端 ,值得一提的是它还是免费的,业界良心有木有。只要你简单学习过 Git 的设计思路,加之以前对 CornerStone、TortoiseSVN 的使用经验,应该可以很快上手。

已经有童鞋上传到百宝箱,下载地址:http://10.20.18.148/desktop/index.php?share/file&user=ff&sid=yJqMAGYk7

Sublime Text

首先需要 安装 Package Control3 。完成后 Cmd + Shift + p 打开 Command Plalette ,输入 install package 进入插件安装界面,再输入 git ,选择 git 插件并安装。安装完成后在 Tools 菜单上就可以找到 Git 插件,如下图所示:

此外,Git DiffHelper 插件提供了展示上一次更新以来代码的改动情况的工具。还有很多 Git 相关插件,读者可以自行尝试。

Atom

Atom 提供了和 Sublime Text 类似的 Git Plus 插件,可以在 Preference -> Install 里头安装。

Android Studio

Git Integration 插件提供了和上述插件类似的功能菜单,如下图所示:

XCode

Xcode 原生提供了对 Git 的支持。此外,还可以通过 Alcatraz 安装 GitDiff 插件,以展示上一次更新以来代码的改动情况。

Emacs

好吧我承认这一节没几个人会看,不过 Emacs 下的 Magit 真的很好用。

Vim

Vim 同样也提供了非常实用的 Git 插件,安装配置方法如下:

  1. 卸载 Vim ;
  2. 安装 Emacs 和 Magit 。

如何合并代码

版本控制最烦的事情就是合并代码了。虽然 Gitlab 的 Merge Request 已经减少了上游开发者合并代码的负担,但代码冲突依然是无可避免的。

Git 对于有冲突的代码会使用诸如 >>>>>>> 的特殊标记标出有冲突的部分,所以手动决定这些部分的去留是合并代码的一种做法。如果觉得实在太原始,那么可以借助其他合并工具来合并代码。这里介绍的是使用 Beyond Compare 作为 Diff 和合并工具的方法。

使用 Beyond Compare 合并代码的效果如下图,是不是非常直观?

安装 Beyond Compare

百宝箱地址:http://10.20.18.148/desktop/index.php?share/file&user=ff&sid=eEdScVmh3

安装 Command Line Tools

执行如下命令手动安装:

$ 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 ,如果出现如下内容,说明安装成功。

配置 Beyond Compare 作为 Git 的合并工具

终端执行:

$ 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 和合并。

配置 Beyond Compare 作为 SourceTree 的合并工具

SourceTree 也可以配置 Beyond Compare 作为合并工具。打开 SourceTree 的设置界面,在 Diff 面板中设置如下:

Visual Diff Tool: OtherDiff Command:/usr/local/bin/bcompArguments:-ro $LOCAL $REMOTEMerge Tool: OtherMerge Command:/usr/local/bin/bcompArguments:$LOCAL $REMOTE $BASE $MERGED

使用 Sublime Text 作为 Commit 编辑器

如果你跟我一样习惯直接使用命令来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 :

  • 方法一:使用 curl

$ brew install curl$ curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
  • 方法二:使用 wget

$ 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)

oh-my-zsh 提供了丰富的插件2,可以根据需求添加需要的插件。

免密码push代码

每次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.218port 8123

最后将项目的仓库地址由默认的 http 协议改为 ssh 协议:

$ git remote remove origin$ git remote add origin git@10.20.11.218:[项目名].git

注意将 [项目名] 改为实际的项目名,例如 FFProject/App_Android 。完整的地址可以直接在每个仓库的主页里找到:

默认 commit message

通过加钩子实现诸如风格检查、默认commit message的任务。下面的代码实现了在 git commit 时给出默认的 commit message 。

#!/bin/shBRIEF="[项目名][模块名][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

Gitlab 篇

批量迁移 SVN 项目到 Gitlab

试试我的 git-svn-transfer1 。

项目主页直接展示项目文件

gitlab 默认显示的项目主页只展示了 README ,显得太单调:

如果希望像 Gitlab 那样同时展示文件列表,可以访问 preference设置页 修改默认展示内容为 files :

完成后再次进入项目主页,你会发现项目变成了类似 Github 上的样子,还是那个熟悉的味道~

想念 Github 的格子?

想念 Github 上的格子?Gitlab 也有。点击左下角你的头像就可以访问你的个人统计页面。如下图所示:

期待有朝一日我们的 Gitlab 里出现像 Jake Wharton1 这样的码神:


0 0
原创粉丝点击