讓你的git擁有不一樣身份

因爲你沒有進行過特別的設定,因此git無論它是往github上傳仍是往你公司的服務器上傳,都會以一個徹底相同的身份上傳,這有時候會形成困擾,好比說這樣:git

clipboard.png

但其實這是我公司的服務器,我不想讓它以fengerzh的身份上傳,我想只有在我往github上傳的時候才以fengerzh上傳,而我往公司服務器上傳的時候就以zhangjing的身份上傳,那該怎麼作呢?github

最直接的方法是在你git clone下來的倉庫裏,有一個.git文件夾,.git文件夾裏有一個config文件,在這個文件裏寫上bash

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

就好了。服務器

但問題是我有幾十個倉庫,不能一個一個設吧,並且萬一我忘記了怎麼辦?因此咱們須要有一些自動化的小工具來幫助咱們完成這件事情。dom

首先,你要先創建這麼一個文件夾:ssh

mkdir -p ~/.git-templates/hooks

而後你要告訴git這個文件夾就是你的模板文件夾:ide

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>"

切記,必定要賦予這個文件可執行權限,不然你的鉤子工做不起來:post

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項目,感興趣的同窗能夠去這裏參觀學習。

相關文章
相關標籤/搜索