专栏首页程序员宝库让你的 git 拥有不同身份

让你的 git 拥有不同身份

由于你没有进行过特别的设定,所以 git不管它是往 github上传还是往你公司的服务器上传,都会以一个完全相同的身份上传,这有时候会造成困扰,比如说这样:

但其实这是我公司的服务器,我不想让它以 fengerzh的身份上传,我想只有在我往 github上传的时候才以 fengerzh上传,而我往公司服务器上传的时候就以 zhangjing的身份上传,那该怎么做呢?

最直接的方法是在你 git clone下来的仓库里,有一个 .git文件夹, .git文件夹里有一个 config文件,在这个文件里写上

[user]
    email = zhangjing@mydomain.com
    name = zhangjing

就行了。

但问题是我有几十个仓库,不能一个一个设吧,而且万一我忘记了怎么办?所以我们需要有一些自动化的小工具来帮助我们完成这件事情。

首先,你要先建立这么一个文件夹:

mkdir -p ~/.git-templates/hooks

然后你要告诉 git这个文件夹就是你的模板文件夹:

git config --global init.templatedir ~/.git-templates

再然后,你在这个文件夹里放上一个钩子文件:

vi ~/.git-templates/hooks/post-checkout

这个钩子文件的内容就是下面这样:

#!/bin/bash

function warn {
  echo -e "\n$1 Email and author not initialized in local config!"
}

email="$(git config --local user.email)"
name="$(git config --local user.name)"

if [[ $1 != "0000000000000000000000000000000000000000" || -n $email || -n $name ]]; then
  exit 0
fi

remote="$([[ $(git remote | wc -l) -eq 1 ]] && git remote || git remote | grep "^origin$")"

if [[ -z $remote ]]; then
  warn "Failed to detect remote."
  exit 0
fi

url="$(git config --local remote.${remote}.url)"

if [[ ! -f ~/.git-clone-init ]]; then
cat << INPUT > ~/.git-clone-init
#!/bin/bash
case "\$url" in
  *@github.com:*    ) email=""; name="";;
  *//github.com/*   ) email=""; name="";;
esac
INPUT
  warn "\nMissing file ~/.git-clone-init. Template created..."
  exit 0
fi
. ~/.git-clone-init

if [[ -z $name || -z $email ]]; then
  warn "Failed to detect identity using ~/.git-clone-init."
  exit 0
fi

git config --local user.email "$email"
git config --local user.name "$name"

echo -e "\nIdentity set to $name <$email>"

切记,一定要赋予这个文件可执行权限,否则你的钩子工作不起来:

chmod +x ~/.git-templates/hooks/post-checkout

接下来,你还要再建立另一个文件:

vi ~/.git-clone-init

这个文件的内容是像下面这样:

case "$url" in
  *@github.com:*  ) email="buzz.zhang@gmail.com";    name="fengerzh";;
  *//github.com/* ) email="buzz.zhang@gmail.com";    name="fengerzh";;
  *@mydomain.com:*    ) email="zhangjing@mydomain.com"; name="zhangjing";;
  *//mydomain.com/*   ) email="zhangjing@mydomain.com"; name="zhangjing";;
esac

在这里,我们指明了如果仓库来源是 github的话我们用哪个用户,如果仓库来源是公司服务器的话又该用哪个用户。

做完了这些事,我们来重新 git clone一下我们的仓库看看吧:

$ git clone ssh://git@mydomain.com/source/ys.git
Cloning into 'ys'...
remote: Counting objects: 1003, done.
remote: Compressing objects: 100% (591/591), done.
remote: Total 1003 (delta 476), reused 506 (delta 221)
Receiving objects: 100% (1003/1003), 691.97 KiB | 1.71 MiB/s, done.
Resolving deltas: 100% (476/476), done.

Identity set to zhangjing <zhangjing@mydomain.com>

可以看到,已经设置成功了。再来看一下克隆之后生成的配置文件吧:

$ cat ys/.git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = ssh://git@mydomain.com/source/ys.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    email = zhangjing@mydomain.com
    name = zhangjing

在这里我们看到文件末尾自动增加了两行关于身份的配置,有了这两行,我们再也不用担心 push的时候弄错身份了。

整个原理其实就是利用了 git的三个特性:初始模板钩子函数本地配置。在初始模板里我们设定好了一个钩子函数,这样只要一执行克隆操作,首先 git会把我们的模板文件里的钩子函数复制到本地仓库里,然后开始执行这个钩子函数,最后根据 URL地址设置我们的本地配置。

以上这些代码其实并不是我写的,而是来源于一个 github项目,感兴趣的同学可以去这里(https://github.com/DrVanScott/git-clone-init)参观学习。

觉得本文对你有帮助?请分享给更多人。

本文分享自微信公众号 - 程序员宝库(chengxuyuanbaoku)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Git 的使用

    关联本地和远程仓库 1.安装git 先安装homebrew,然后通过homebrew安装git。 git中clone项目有两种方式:https和ssh http...

    程序员宝库
  • 我必须得告诉大家的 MySQL 优化原理

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型….. 你是否真的理解...

    程序员宝库
  • localStorage 还能这么用

    HTML5中 Web Storage 的出现,主要是为了弥补使用 Cookie 作为本地存储的不足。Cookie 存储的数据量非常小,而且数据会自动携带到请求头...

    程序员宝库
  • Git文件名过长导致不能提交到缓存区或同步到本地

    1.在上传文件的文件夹下打开git bush here 2.操作命令: $ git config --system core.longpaths true (将...

    DrawSky
  • 实习生的代码被弄丢了!救命的时候绝对用的上——每天三分钟玩转Git (8)

    新来的实习生【悲郭】因为不太熟悉git的使用,总是把自己的代码给弄丢了,这次好了,把辛苦写了一个月的功能全弄丢了。还好我力挽狂澜帮他恢复了过来。下面我们分两种代...

    机智的程序员小熊
  • 你可能不知道的15个 Git 命令[每日前端夜话0xF5]

    Git 有时可能会令人生畏。因为有太多的命令和细节需要学习。不过虽然文档的内容很多,但阅读起来还是很轻松的。一旦你克服了最初不堪重负的感觉,就会感觉到有明显进展...

    疯狂的技术宅
  • [日常] git版本回退

    先克隆一个空的测试仓库,这是我自己在gitlab里创建的空仓库 git clone http://192.168.1.114:8090/admintsh/blo...

    陶士涵
  • 10种Git技巧,让你省时省力又省心!

    大家是否曾销毁文件只为能重新开始? 或需要在另一分支的某文件中进行更改?而git指令可以实现从另一分支切换文件。

    昱良
  • Git撤销&回滚操作

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • git schnnel failed to receive handshake, SSLTLS connection failed

    C:\Code\git>git p fatal: unable to access ‘https://github.com/i042416/KnowlegeR...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券