Git
- "我遇到過一些人,他們認為 Git 是 GitHub 的前端。他們錯了,Git 其實是 AUR 的前端。" — Linus Torvalds
Git 是由 Linux 內核作者 Linus Torvalds 設計並開發的版本控制系統(VCS),現在被用來維護 AUR 軟體包以及數以千計的其他項目,其中包括 Linux 內核。
安裝 git包 軟體包。要使用開發版本,請安裝 git-gitAUR 軟體包。當使用 git svn、git gui 和 gitk 等工具時請檢查可選依賴項是否安裝。
參考 git GUI Clients。
- Commit — 幫助編寫更好的 Git 和 Mercurial 提交消息的編輯器。
- Forge Sparks — 支持 Github、GitLab、Gitea 和 Forgejo 的簡單通知應用。
- Giggle — 用於 git 的 GTK+ 前端。
- GitAhead — 一個包含內置合併工具的 git 前端。
- GitButler — 基於 Git 的版本控制客戶端,使用 Tauri/Rust/Svelte 構建。
- Git Cola — 用 Python 編寫的絲滑而強大的 git 圖形前端。
- Git Extensions — 允許用戶不使用命令行就可以完成 git 各項操作的圖形前端。
- gitg — 用於查看 git 倉庫的 GNOME GUI 客戶端。
- git-gui — Tcl/Tk 庫編寫的可移植 git 圖形前端。
- GitHub Desktop — 由 GitHub 開發的一個基於 Electron 的 GitHub 客戶端。
- gitk — Tcl/Tk 庫編寫的 Git 倉庫查看器。
- https://git-scm.com/docs/gitk || git包 + tk包
- Gittyup — 基於 Qt 的 Git 客戶端。
- Guitar — 一個 Git 的圖形化前端。
- gitui — 用 Rust 編寫的快速的 Git 終端用戶界面。
- Kommit — KDE 的 Git GUI 客戶端。
- lazygit — 一個簡潔的 Git TUI 工具。
- QGit — 可圖形化地按照不同開發分支顯示修訂歷史記錄、查閱補丁內容、查看被修改文件的 Git GUI 查看器。
- RabbitVCS — 一組圖形化工具,用於輕鬆、直接地訪問您使用的版本控制系統。
- Sublime Merge — 由 Sublime Text 開發商開發的 Git 前端。
- Tig — 基於 ncurses 的 git 字符模式前端。
- ungit — 在不犧牲 git 各種功能的情況下使其變得更加友好。
你至少需要設置好姓名和郵箱之後才能開始使用 Git:
$ git config --global user.name "John Doe" $ git config --global user.email "johndoe@example.com"
更多設置選項可參閱#提示與技巧。
一個 Git 版本庫包含在一個名為 .git 的目錄內,該目錄包含了修訂歷史以及其他元數據。版本庫所跟蹤的目錄(默認為父目錄)稱為工作目錄。在工作樹進行的更改在被提交 (commit) 前需要先暫存 (stage) 起來。Git 還可以讓你恢復以前提交的工作樹文件。
參見起步。
Git 從 4 個 ini 類型的配置文件裡讀取配置:
-
/etc/gitconfig是應用於整個系統的默認配置文件 -
~/.gitconfig和~/.config/git/config(自 1.7.12 起)是應用於特定用戶的配置文件 -
.git/config是應用於特定倉庫的配置文件
這些文件可以直接編輯,但是更常用的方法是使用 git config,下面是一些示範。
列出當前已配置的變量:
$ git config list {--local,--global,--system}
$ git config --global core.editor "nano -w"
設置默認的推送 (push) 行為:
$ git config --global push.default simple
設置不同的 git difftool 工具(默認是 meld):
$ git config --global diff.tool vimdiff
更多信息請參閱 git-config(1) 和配置 Git。
自 2012 年的 v1.7.10 版本起,Git 能夠使用 include 關鍵字在 gitconfig 文件中構建分割成多個配置文件的配置。
--local 或 --global 標誌時,默認禁用加載包含的配置文件。要啟用它,請將 --includes 標誌與 git config get 和 git config list 命令一起使用。- 當你想為一個現有的項目貢獻時,請先閱讀並理解這個項目的許可,因為它可能會過度限制你更改代碼的權力。有些許可會在代碼的所有權方面引起爭議。
- 理解這個項目的社區,以及你可以融入其中的程度。要了解項目的主要方向,可以閱讀所有文檔甚至是代碼庫的 log。
- 當發起一個合併請求,或者提交一個補丁時,保證它是小改動並且有完善的文檔;這將有助於項目維護者理解你的改動,並決定是否合併這些改動或是讓你再改一下。
- 如果貢獻被拒絕,不要氣餒,畢竟這是他們的項目。如果它很重要,請儘可能清楚和耐心地討論這次貢獻的理由,最終可能通過這種方法解決問題。
每次向 Git 伺服器推送時都要認證身份,你可能會想要避免這種麻煩。
- 如果你是用 SSH 密鑰來認證的,請使用 SSH agents。參閱 OpenSSH#Speeding up SSH 和 OpenSSH#保活。
- 如果你是用帳號和密碼來認證的,在伺服器支持 SSH 的情況下請切換至 SSH 密鑰,否則請嘗試 git-credential-cache 或 git-credential-store。
Git 可能會從 org.freedesktop.secrets 兼容密鑰環(如 GNOME Keyring、KeePassXC 或 KDE Wallet)獲取您的憑據。因此,設置一個兼容的密鑰環,並使用以下命令檢查密鑰環是否已註冊到 dbus:
$ dbus-send --session --print-reply --dest=org.freedesktop.DBus / \
org.freedesktop.DBus.GetConnectionUnixProcessID \
string:org.freedesktop.secrets
然後運行
$ git config --global credential.helper /usr/lib/git-core/git-credential-libsecret
設置 git。
Git 可以讀取 netrc 文件來訪問憑據。首先,將 Git 指向 netrc 幫助程序腳本:
$ git config --global credential.helper /usr/share/git/credential/netrc/git-credential-netrc.perl
然後,創建 .netrc 文件:
~/.netrc
machine git-host login username password password
如果您想保護您的機密安全,憑證幫助程序還支持 gpg 加密文件 (~/.netrc.gpg)。
如果你正在使用一個上述那種復用的 SSH 連接,讓 Git 使用 SSH 可能比使用 HTTPS 更快。同時,一些伺服器(比如 AUR)只允許通過 SSH 推送更改。例如,像下面這樣配置可以使得 Git 通過 SSH 訪問 AUR 上的任何倉庫。
~/.gitconfig
[url "ssh://aur@aur.archlinux.org/"] insteadOf = https://aur.archlinux.org/ insteadOf = http://aur.archlinux.org/ insteadOf = git://aur.archlinux.org/
要啟用 Bash 的自動補全,請在 Bash 啟動文件裡用 source 加載 /usr/share/git/completion/git-completion.bash 文件。或者也可以安裝 bash-completion包。
Git 包帶有一個提示符腳本。要啟用它,請用 source 加載 /usr/share/git/completion/git-prompt.sh 腳本,然後使用 %s 參數設置一個自定義 shell 提示符:
-
Bash 用戶:
PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' -
Zsh 用戶:
setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '提示:Zsh 提供了vcs_info函數作為替代方案。參見 zshcontrib(1) § GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS。
注意命令替換必須被轉義,詳情見 Bash/Prompt customization#Embedding commands。持久化配置見 命令行解釋器#配置文件。
當切換至一個 Git 倉庫所在目錄時,shell 提示符會變成所在分支名稱。也可以配置提示符來顯示其他信息:
| Shell 變量 | 信息 |
|---|---|
| GIT_PS1_SHOWDIRTYSTATE | 已暫存 (staged) 顯示 +,未暫存 (unstaged) 顯示 *。
|
| GIT_PS1_SHOWSTASHSTATE | 已儲藏 (stashed) 顯示 $。
|
| GIT_PS1_SHOWUNTRACKEDFILES | 有未跟蹤文件時顯示 %。
|
| GIT_PS1_SHOWUPSTREAM |
<, >, <> 分別表示落後、領先或偏離上游。
|
| GIT_PS1_STATESEPARATOR | 分支名稱和狀態符號之間的分隔符 |
| GIT_PS1_DESCRIBE_STYLE | 分離 HEAD 時,相對於標籤/分支顯示提交 |
| GIT_PS1_SHOWCOLORHINTS | 顯示顏色 |
環境變量的完整文檔可在腳本的注釋中找到。
- 如果發生了
$(__git_ps1)返回((unknown))的情況,是因為有一個.git文件夾在你當前的文件夾裡面,但卻不包含任何存儲庫,因此 Git 不認識它。例如,將 Git 在~/.gitconfig的配置文件誤認為在~/.git/config就會發生這種情況。 - 如果提示符在遇到非常大的存儲庫時延遲,很可能是由於
GIT_PS1_SHOWUNTRACKEDFILES選項,該選項每次都會觸發完整的目錄樹掃描以檢測新文件,從而導致明顯的性能影響。要為這些存儲庫本地禁用此選項,您可以使用命令git config --local bash.showUntrackedFiles false。
你也可以使用來自 AUR 的自定義 git shell 提示符軟體包,例如 bash-git-promptAUR 或 gittifyAUR。
要了解已經完成了多少工作:
$ git diff --stat
帶有 fork 顯示的 git log:
$ git log --graph --oneline --decorate
給圖形化的 git log 做一個別名(使用 git graph 即可顯示經過修飾的 log):
$ git config --global alias.graph 'log --graph --oneline --decorate'
重置為以前的提交(非常危險,這會擦除所有跟蹤文件到指定提交):
$ git reset --hard HEAD~
如果遠程倉庫的地址發生變化,可以這樣更新它的位置:
$ git remote set-url origin git@address:user/repo.git
自動附加簽名行到提交(將某個 姓名-電郵 簽名添加到提交中,某些項目會要求這樣做):
$ git commit -s
自動附加簽名到補丁(使用 git format-patch commit 時生效):
$ git config --local format.signoff true
提交已更改文件的特定部分。如果有大量更改時,最好拆分成多個提交,這種情況下這個命令通常很有用:
$ git add -p
Git 允許使用 GnuPG 對提交和標籤進行簽名,請參見簽署工作。
export GPG_TTY=$(tty)(或者使用 pinentry-tty),否則當 GPG 處於鎖定狀態時簽名這一步會失敗(因為它無法在 shell 提示符裡詢問 pin 碼)。配置 Git 使它自動對提交進行簽名:
$ git config --global commit.gpgSign true
偶爾項目維護人員會要求你在其他分支上完成工作。這些分支通常被稱為 devel 或 testing。首先要克隆存儲庫。
要進入不是主分支的分支(git clone 只會顯示主分支,但其他分支其實也是存在的,用 git branch -a 可以顯示出來):
$ git checkout -b branch origin/branch
然後就可以像平常一樣編輯文件,但是要使得整個倉庫都保持同步,下面這兩個命令都要用:
$ git pull --all $ git push --all
如果你想直接將補丁發送至一個郵件列表,需要安裝以下軟體包:perl-authen-sasl包 和 perl-io-socket-ssl包。
確保你已經配置了用戶名和郵件地址(參見#配置)。
配置你的郵箱設置:
$ git config --global sendemail.smtpserver smtp.example.com $ git config --global sendemail.smtpserverport 587 $ git config --global sendemail.smtpencryption ssl $ git config --global sendemail.smtpuser foobar@example.com
現在你應該可以將補丁發送至某個郵件列表了(可參閱OpenEmbedded: 通過電子郵件發送補丁和 git-send-email.io):
$ git add filename $ git commit -s $ git send-email --to=openembedded-core@lists.openembedded.org --confirm=always -M -1
使用大型遠程存儲庫時,必須獲取大量數據。以下示例使用 Linux 內核來說明如何使用此類代碼庫。
最簡單的解決方案是獲取整個存儲庫:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
git clone 不支持斷點續傳。可以通過 git pull 更新存儲庫。
為了將本地存儲庫限制為原存儲庫的較小子集,例如在 v4.14 之後分離出錯誤,請使用淺克隆 (shallow clone):
$ git clone --shallow-exclude v4.13 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
將獲取 v4.14 及更高版本,但不會獲取 v4.13 及更早版本。
如果您只想要最新的快照,則可以忽略所有歷史記錄。(如果有可用且足夠完整的 tarball,請選擇它。從 git 存儲庫下載需要更大的帶寬。)您可以使用以下命令獲取它:
$ git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
可以在之後獲取較舊的提交,如以下兩個示例:
$ git fetch --tags --shallow-exclude v4.1 $ git fetch --tags --shallow-since 2016-01-01
--tags,就不會獲取標籤。Scalar,前身是 Virtual File System for Git (VFS for Git),允許無需本地實例訪問 git 倉庫。
參見 scalar(1)。
在上面的示例中,本地的倉庫僅跟蹤主線內核,即"最新開發"的內核。假設你想獲取最近的 LTS 內核,比如最新的 4.14 分支,可以這麼做:
$ git remote set-branches --add origin linux-4.14.y $ git fetch --shallow-exclude v4.14 $ git branch --track linux-4.14.y origin/linux-4.14.y
最後一行不是必須的,但你應該需要執行它。 (要獲取需要的那個分支的具體名稱,沒有什麼通用的方法,或許可以靠 Gitweb 頁面的"ref"連結來猜測)
如果需要 linux-4.14.y 的快照,這樣做:
$ git checkout linux-4.14.y
或者將它解壓到其他目錄裡:
$ mkdir /path/to/src-4.14; cd /path/to/src-4.14 $ git clone --no-local --depth 1 -b linux-4.14.y ../linux-stable
然後像平常一樣,執行 git pull 來更新你的快照。
有時,軟體可能會將純文本密碼保存在配置文件中,而不是掛接到密鑰環中。在這些情況下,git clean-filters 可能很方便,可以避免意外提交機密信息。例如,以下文件將過濾器分配給文件"some-dotfile":
.gitattributes
some-dotfile filter=remove-pass
每當文件"some-dotfile"添加到 git 時,git 都會在添加之前對文件調用過濾器"remove-pass"。必須在 git 配置文件中定義過濾器,例如:
.git/config
[filter "remove-pass"] clean = "sed -e 's/^password=.*/#password=TODO/'"
通過安裝 git-htmldocsAUR,可以以 HTML 形式獲取 git help 文檔。安裝後,可以通過傳遞 -w 標誌來訪問 HTML 文檔。例如:
$ git help -w merge
可以通過設置 git config 選項默認加載 HTML 文檔:
$ git config --global help.format html
- git-extras — Git 實用工具集合(倉庫摘要、repl、變更日誌、作者提交百分比等)
- https://github.com/tj/git-extras || git-extrasAUR - 如果使用 oh-my-zsh,還可以啟用 git-extras 插件
- gitflow-cjs — 使用 Vincent Driessen 的分支模型擴展 Git。CJS 版本是一個積極維護的分支。
- gitmoji-cli — 一個 gitmoji 交互式 NodeJS 客戶端,用於在提交消息中使用 gitmojis。
- git-annex — 用 Haskell 編寫的分布式文件同步系統,允許使用 Git 管理大數據。
- git-bulk — 用 Bash 編寫的命令行工具,用於管理多個 Git 倉庫。
- mani — 用 Go 編寫的命令行工具和 TUI,用於管理多個 Git 倉庫。
- gita — 用 Python 編寫的命令行工具,用於管理多個 Git 倉庫。
- mu-repo — 用 Python 編寫的命令行工具,用於管理多個 Git 倉庫。
- myrepos (mr) — 用 Perl 編寫的命令行工具,用於管理多個 Git 倉庫。