前注:這是一篇糅雜心路歷程與技術乾貨的文章,委婉到來,不喜輕噴~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
何況「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 hylerrix
和 git 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 成爲世界上最流行的語言助力了一把:
- Hello,我是韓亦樂,現任本科軟工男一枚。軟件工程專業的一路學習中,我有不少感悟,也享受持續分享的過程。若是想了解更多或能及時收到個人最新文章,歡迎訂閱個人我的微信號:韓亦樂。個人簡書我的主頁中,有個人訂閱號二維碼和 Github 主頁地址;個人知乎主頁 中也會堅持產出,歡迎關注。
- 本文內部編號經由個人 Github 相關倉庫統一管理;本文可能發佈在多個平臺但僅在上述倉庫中長期維護;本文同時採用【知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議】進行許可。