Git 奇淫技巧:Github ID 改名奇遇記

前注:這是一篇糅雜心路歷程與技術乾貨的文章,委婉到來,不喜輕噴~php

心路篇

碾轉多年,終於敲定了本身的 Github ID 英文名。前端

從高中最先起的「corvoh」是想致敬 2012 年度黑馬遊戲做品 「Dishonored」 的。這是一款動做冒險遊戲,科技與超天然力量並存,在集權工業城市中潛行與暗殺,很符合我當年對待壓抑至極的高考時的心境。可奈何「corvoh」容易重名,在有些不錯的網站平臺上起個性域名時會遇到衝突,只得做罷。node

界外魔:「我不瞭解你,科爾沃,但我很享受這齣好戲。陰謀與祕密,屠殺和背叛,一個帝國死亡前的陣痛!而你是一個復仇之神,處處散播混亂。這城市已在自生自滅,騙子和商人和貴族就像屍骸上的蛆通常,很快連老鼠也沒有能夠吃的了。這樣也好,帝國已在滅亡,完全的腐爛了,所須要的只是一個合適的人把它推出斷崖。」

大學開學擁有了屬於本身的一部 iPhone 5S,深深的被其美感和 ios 生態折服,很天然的成爲了果粉。就想到了加個果粉標誌——「icorvoh」,各平臺暢通無阻,因而用到了如今。linux

在這段時間裏,認識了不少前端技術圈的大牛,每個人的風格都很凸顯,其中就包括了 ID 名的獨一性。相比個人「icorvoh」,連我周圍的人都不知道怎麼讀出來...。webpack

某:「你的 Github ID 是多少?i 什麼什麼?咱們互關一下」
我:「嗯...i, c, o, r, v, o, h....」

是時候打破僵局了,從新起一個更專屬的名字了。因而,這就擺在了 2018 年就要到來前的重要議程上。結合本身的真實姓名「韓亦樂」的拼音首字母,嘗試在其後加上一個朗朗上口的後綴,就有了最終版 ID 名。ios

Hylerrix

何況「hyle」有「原質」、「原始物質」的意思,哲學寓意挺能浮想連篇的。git

那麼,爲何如此注重 ID 名的選取?github

哲學角度來講,哲學三大問題是:我是誰?我從哪裏來?我要到哪裏去?學習編程的過程當中,除了去深刻理解數據類型、數據結構、設計模式、算法思想等編程硬核心外,更要深刻探索本身的性格、本身對行業的見解以及本身想要在行業取得的成就等等。一個好的 Github ID 名,就是告訴本身,告訴你們「我是誰」,是一切的起源。哈,這仍是有點偏題了。web

另外一個角度,Phil KarIton 說過,「計算機科學只存在兩個難題:緩存失效和命名。」。代碼主要是人讀的,偶爾在機器上跑一下。所以,每一個變量、常量、架構分層如何有一個合理的名字,將是化解軟件危機再出現的基石之一。算法

技術篇

在更名以前,咱們的綠條是這樣的,展示了咱們這一年全部的有效 Commit:

更名以前的綠點點

第一步,更名,Commit 綠點所有消失。

Github 用戶設置裏,點擊修更名字,會獲得以下提示:

Really change your username?
Unexpected bad things will happen if you don’t read this!

  • We will not set up redirects for your old profile page.
  • We will not set up redirects for Pages sites.
  • We will create redirects for your repositories (web and git access).
  • Renaming may take a few minutes to complete.

其中重點提到了,更名會有意想不到的反作用,且 Github 不會爲用戶以前的 ID 名做跳轉,但會對倉庫作跳轉。修改 ID 名後,Commit 幾乎所有消失,剩下的綠點和 ID 名不要緊,主要是本身帳號某時提交了 issue 、本身某時加入了新組織、某時創建了新倉庫的信息。

消失的綠點點

第二步,修改 Git 全局用戶名和郵箱號。

如何恢復本身的綠點呢?在 Github 幫助手冊有關 Commit 綠點的出現原理中要求到:「The email address used for the commits is associated with your GitHub account.」,這要求咱們每一個 Commit 的做者 ID、郵箱號必須和咱們當前用戶 ID、郵箱號一致,命令行輸入 git log 能夠看到倉庫全部提交的做者信息都是舊信息,也所以綁定不到 Github 的綠點中。

commit 226f837858d68a75797a895c90cf296699550a15 (HEAD -> master)
Author: hylerrix <hylerrix@foxmail.com>
Date:   Wed Dec 20 15:16:49 2017 +0800

    :tada: init

答案藏在 Git 全局配置文件裏,直接修改配置文件 vim ~/.gitconfig裏的用戶名和郵箱號,或輸入git config --global user.name hylerrixgit config --global user.email hylerrix@foxmail.com 間接設置用戶名和郵箱號。

git config --global --list 能夠展現出咱們的 Git 全局配置,修改以前的以下。

修改以後,咱們的每次新的 Commit 便會使用新的 ID 名和郵箱號提交,被 Github 綠點機制跟蹤到。但是,要修改以前已經提交過的記錄怎麼辦?

第三步,修改歷史記錄裏的 Commit 做者信息

使用 git commit --amend 顯然不行,這隻會修改咱們最後一次提交記錄的 Commit Message 信息,其中的做者信息更是沒法被修改。

這裏就要用到 git filter-branch 核彈級命令了,編寫 git-user-change.sh 腳本,便可將主分支下全部曾經的舊 ID 名和舊郵箱號改成新的 ID 名和新的郵箱號。源碼以下:

#!/bin/sh
 
git filter-branch --env-filter '
    an="$GIT_AUTHOR_NAME"
    am="$GIT_AUTHOR_EMAIL"
    cn="$GIT_COMMITTER_NAME"
    cm="$GIT_COMMITTER_EMAIL"

    if [ "$GIT_COMMITTER_EMAIL" = "icorvoh@qq.com" ]
    then
        cn="hylerrix"
        cm="hylerrix@foxmail.com"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "icorvoh@qq.com" ]
    then
        an="hylerrix"
        am="hylerrix@foxmail.com"
    fi
 
    export GIT_AUTHOR_NAME="$an"
    export GIT_AUTHOR_EMAIL="$am"
    export GIT_COMMITTER_NAME="$cn"
    export GIT_COMMITTER_EMAIL="$cm"
'

此腳本專門用來在命令行使用 sh 命令執行,將其放在須要修改的項目的上一層文件夾中執行 sh ../git-user-change.sh 便開始自動化重寫全部腳本能匹配到的提交信息了。擁有條件判斷的此腳本,最大的好處即是,不會覆蓋掉團隊協做項目中,他人的提交信息。

> $ sh ../git-user-change.sh                            [±master ✓▴]
Rewrite f19e5ecd9ab22ee87a3c46329b792db43ebd90a5 (455/457) (24 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten

核彈級的 git filter-branch 還能作不少事情,好比將某個文件從 Git 歷史記錄刪除,總而下降 Git 項目的大小:

git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch ./src.zip' --prune-empty --tag-name-filter cat -- --all

這條命令會將項目 Git 全部歷史裏刪除對 src.zip 的記錄,整個 .git 文件夾會輕不少。

第四步,解決強制更新遠程倉庫時的 SSH Key 問題

git filter-branch 的反作用是修改到的 Git Commit 的 Commit ID 也會被改變。這會影響到整個 git 歷史線。所以咱們須要用到 git push origin --force 強制更新。若是你的當前項目有不少人同時在協做,那就糟了,須要讓其餘人的倉庫也強制更新你的 Commit 歷史信息。這種分佈式協做方式致使每人電腦上都有一份完整的 Git 信息的方式,是否是有些像比特幣?

說 push 就 push,但會遇到權限問題:

> $ git push origin --force                                 [±master ✓▴▾]
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/ningowood/commit-git.git/'

這是由於,即便本地全局配置中的用戶名和郵箱號已經更新,但也所以致使 ssh-key 對應不了 Github 上的公鑰。須要咱們從新設置 ssh-key。輸入新的 ssh-key 配置,大膽覆蓋以前的公鑰密鑰就好。

hanyile@hanyiledeMacBook-Air ~/WorkSpace/Practice/commit-git              [0:41:32]
> $ ssh-keygen -t rsa -C "hylerrix@foxmail.com"                           [±master ✓▴▾]
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hanyile/.ssh/id_rsa):
/Users/hanyile/.ssh/id_rsa already exists.
Overwrite (y/n)?

公鑰的內容輸入如下命令能夠獲取到:

cat ~/.ssh/id_rsa.pub

接下來便將公鑰內容粘貼到 Github 遠程 SSH Key 配置中便可。

第五步,強制更新,刪庫跑路

再次輸入 git push origin --force,Git 將會把遠程全部內容更新爲本地的狀態。

> $ git push origin --force                               [±master ✓▴▾]
Username for 'https://github.com': hylerrix
Password for 'https://hylerrix@github.com':
Counting objects: 1824, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (588/588), done.
Writing objects: 100% (1824/1824), 129.63 KiB | 2.54 MiB/s, done.
Total 1824 (delta 451), reused 1366 (delta 451)
remote: Resolving deltas: 100% (451/451), done.
To https://github.com/ningowood/commit-git.git
 + e6ce9c3...39b4606 master -> master (forced update)

一個倉庫搞定了,剩下的倉庫都不難了。將遠程全部和本身提交記錄有關的倉庫都 clone 下來,集體進行高效更改,以下更改的是個人 hylerrix-demos 倉庫裏的項目:

cd js-design-patterns && sh ../git-user-change.sh && cd ..
cd linux-c && sh ../git-user-change.sh && cd ..
cd node-server && sh ../git-user-change.sh && cd ..
cd php-oo && sh ../git-user-change.sh && cd ..
cd servlet-jsp && sh ../git-user-change.sh && cd ..
cd sql-nosql && sh ../git-user-change.sh && cd ..
cd webpack-learn && sh ../git-user-change.sh && cd ..

Git 倉庫通常保存在遠程就好,須要維護時從新 clone,所以以後修改能夠從本地刪除——集體性強制推送,刪庫跑路。

cd js-design-patterns && git push origin --force && cd .. && rm -rf js-design-patterns
cd linux-c && git push origin --force && cd .. && rm -rf linux-c
cd node-server && git push origin --force && cd .. && rm -rf node-server
cd php-oo && git push origin --force && cd .. && rm -rf php-oo
cd servlet-jsp && git push origin --force && cd .. && rm -rf servlet-jsp
cd sql-nosql && git push origin --force && cd .. && rm -rf sql-nosql
cd webpack-learn && git push origin --force && cd .. && rm -rf webpack-learn

上列每一條命令所耗用的時間都不會少,尤爲是當 Git 項目很大的狀況下。所以,極可能你也會想到同時使用多個終端來作 force push,即強制推送:

在 push 的過程當中,曾經的 1030 個 Git Commit 逐漸恢復中。。

第六步,Commit 綠點的收尾

到了這一步,最終 1030 個 Commit 變成了 942,丟了 88 個 Commit。果真修改用戶名有「沒法預料」的問題,暫不深究,任其消失於迷霧~

推薦一個最近剛火起來的項目,Star 數短短几天臨近上萬——github-profile-summary。只要你 Star 了這個項目,等待一段時間,就能夠在其官網上看到你的 Github 性格圖譜了。

以下是個人 Github 性格圖譜,爲 JavaScript 成爲世界上最流行的語言助力了一把:

github-profile-summary

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息