Skip to main content

4 posts tagged with "Git"

View All Tags

· One min read

修改 Author,可以 commit 時修改也可以事後修改

$ git commit -m "Test" --author "HungWei Chiu<[email protected]>"
$ git commit --amend --author "HungWei Chiu<[email protected]>" --no-edit

如果想要連 commit 一起修改且長期使用,比較簡單的方式就是直接設定 local user/email

$ git config --local user.email "[email protected]"
$ git config --local user.name "HungWei Chiu"

針對當前 commit 可以採用 --reset-author 的方式來修正

git commit  --amend --no-edit --reset-author

· 2 min read

標題: 「Golang 原始碼的的版本控制歷史」 類別: others 連結: https://research.swtch.com/govcs

本篇文章是 rsc 來仔細介紹 golang 的發展歷史,主要是針對整個開發過程的版本控制轉移以及一些有趣的 Commmit 舉例來說,如果你去看 golang 的 commit 會發現第一筆 commit 是 1972 年的內容,並且該 commit 增加了一個 src/pkg/debug/macho/testdata/hello.b 的檔案

而以實際狀況來說,前面四筆都是假的 commit,第五筆 commit 才是 golang 開發的第一筆 commit,這之間的緣由牽扯到版本控制的轉變。 以 Golang 來說,其經歷了四次轉變化,從最初的 Subversion 到 Perforce 到 Mercurial 到 Gerrit

其中 golang 正式對外公開是發生於 Mercurial 的過程中,而這些假的 commit 也是這個時間點由 rsc 自己產生的,當作一個復活節彩蛋的概念 有興趣的可以閱讀全文

· 3 min read

標題: 「GitHub 上常常看到的奇妙 commit 到底是什麼?」 類別: others 連結: https://people.kernel.org/monsieuricon/cross-fork-object-sharing-in-git-is-not-a-bug

每過一段時間都可以於 GitHub 上面看到一些看起來很嚇人的 Commit,最經典莫過於 Linux Kernel 中的各種內容,譬如檔案被砍光,README 加入一些驚嚇言論 不知道情的使用者可能會想說這個內容是真正的 Github Repo 上的東西,鐵定是真正被認可而合併進去的,所以相信不疑。 殊不知這一切其實都只是 Git 的底層設計使得一些有心人可以打造出一些以假亂真的內容,文章中就有列出兩個關於 Linux Kernel 的有趣 Commit.

文章內詳細的去解釋整個來龍去賣以及底層 Git 的設計,包含 blob, tree, commit 之間的關係,並且說明為什麼有心人可以輕鬆的產生這些以假亂真的 Commit。 舉個範例來說,Linux Kernel 的整個 Git 專案大概有 3GB 的大小,然後被 Fork 的次數高達 40000 次,請問從實作方面來考量,你會希望

  1. 每個 Fork 有一份屬於自己的 Git 專案?
  2. 仰賴 Git 的底層設計,針對差異性去記錄每個 Fork 專案?

如果是選項(1)的話,那這樣至少要準備 120TB 的資料,從儲存方面來說完全不是一個可接受的實作方式,因此自然而然的都會是基於(2)的方式去實作 因此該 Linux Kernel 的 Git 專案實際上裡面記錄了所有的 Fork 資料,而每個人針對自己的 Fork 去進行更新等行為也都會記錄到 Linux Kernel 本身的專案上。 換句話說, 那 40000 個 Fork 出來的專案實際上還是共用同一份 Git 專案,因此每個人的 Commit 都只要該 Hash 被知道,其他人都有機會去檢視與瀏覽。

而 GitHub 的 UI 又允許使用者以 Commit Hash 的方式去瀏覽每一個 Commit 的內容,因此就可以跑到主要專案去輸入自己 Fork 產生的 Commit 來產生以假亂真的 Commit 內容。

對於整體有興趣的可以觀看全文

· 2 min read

Basic

  • commit所使用的編輯器會依照下列優先度去選擇,

    1. GIT_EDITOR 環境變數
    2. core.editor 的設定
    3. VISUAL 環境變數
    4. EDITOR 環境變數
    5. vi 指令
  • 變動檔案請用 git mv,使用git rm要注意檔案系統內的檔案會被真的刪除。

  • git log可以列出簡略的coommit資訊

  • git show [commit id] 可以看詳細的commit資訊,可以加上commit ID來指定特定的commit

  • git show-branch --more=10 可以看當前bracnh的詳細commit資訊,由--more控制數量

Configuraion

總共有三種設定方式,優先度如順序

  • .git/config, 可以用 --file或是預設的方式操作
  • ~/.gitconfig, 可以用 --global操作
  • /etc/gitconfig,可以用 --system操作
git config --global user.name "hwchiu" (2)
git config user.email "[email protected]" (1)
  • 可以透過 git config -l列出當前所有的設定
  • 可以透過 --unset來移除設定
git config --unset --global user.name