目錄
1 簡介
本文旨在提供一組實用 Git 命令的快速參考。您應始終使用 Git 直接提供的詳盡且詳細的文件。
git --help man git
向您顯示可用的子命令,
git <command> --help man git-<command>
顯示關於子命令 <command> 的資訊。
更多資訊可以在 Git Reference 網站上找到。
有關 Git 專案的更多資訊,請造訪 Git 網站。
當您遇到問題時,請查閱這些資源,它們相當詳盡。
接下來是 Git 的基本介紹以及一些 FFmpeg 特定的指南,以簡化對專案的貢獻。
2 基本用法
2.1 取得 Git
您可以從 https://git.dev.org.tw/ 取得 Git。大多數發行版和作業系統都為其提供套件。
2.2 複製原始碼樹
git clone https://git.ffmpeg.org/ffmpeg.git <target>
這會將 FFmpeg 原始碼放入目錄 <target>。
git clone git@source.ffmpeg.org:ffmpeg <target>
這會將 FFmpeg 原始碼放入目錄 <target>,並讓您將變更推送回遠端儲存庫。
git clone git@ffmpeg.org:ffmpeg-web <target>
這會將 FFmpeg 網站的原始碼放入目錄 <target>,並讓您將變更推送回遠端儲存庫。
如果您沒有 ffmpeg-web 儲存庫的寫入權限,您可以在建立唯讀 ffmpeg-web 克隆後建立補丁。
git clone git://ffmpeg.dev.org.tw/ffmpeg-web <target>
請確保您的 checkout 中沒有 Windows 行尾符,否則您可能會遇到虛假的編譯失敗。一種實現此目的的方法是執行
git config --global core.autocrlf false
2.3 將原始碼樹更新到最新版本
git pull (--rebase)
從追蹤分支拉取最新的變更。追蹤分支可以是遠端的。預設情況下,master 分支追蹤遠端 origin 中的 master 分支。
建議使用 --rebase
(見下文)。
2.4 重建您的本地分支
git pull --rebase
從主儲存庫提取變更,並在其上重新套用您的本地提交。這是將您的所有本地變更保持在 FFmpeg 的 master 樹頂端所必需的。master 樹將拒絕包含合併提交的推送。
2.5 新增/移除檔案/目錄
git add [-A] <filename/dirname> git rm [-r] <filename/dirname>
Git 需要收到您對工作目錄所做的所有變更的通知,這些變更會導致檔案出現或消失。跨檔案的行移動會自動追蹤。
2.6 顯示修改
git diff <filename(s)>
將以 unified diff 格式顯示您工作目錄中的所有本地修改。
2.7 檢視變更日誌
git log <filename(s)>
您也可以使用圖形工具,例如 gitview
或 gitk
,或 http://source.ffmpeg.org/ 提供的網頁介面。
2.8 檢查原始碼樹狀態
git status
偵測您所做的所有變更,並列出在提交的情況下將採取的動作(新增、修改、刪除等)。
2.9 提交
git diff --check
在將變更提交之前再次檢查,以避免日後出現問題。所有經驗豐富的開發人員都會在每次提交時都這樣做,無論提交多麼小。
他們每個人都曾多次因此避免看起來像個傻瓜。很容易不小心夾帶偵錯輸出或外觀修改,請透過這種額外的審查層級來避免問題。
對於僅限外觀的提交,您應該從以下命令獲得(幾乎)空白的輸出
git diff -w -b <filename(s)>
也請檢查以下命令的輸出
git status
以確保您沒有未追蹤的檔案或刪除。
git add [-i|-p|-A] <filenames/dirnames>
請確保您已告知 Git 您的姓名、電子郵件地址和 GPG 金鑰
git config --global user.name "My Name" git config --global user.email my@email.invalid git config --global user.signingkey ABCDEF0123245
啟用簽署所有提交或使用 -S
git config --global commit.gpgsign true
使用 --global 為您的所有 Git checkout 設定全域組態。
Git 將選擇要提交的檔案變更。您可以選擇性地使用互動式或補丁模式,逐個 hunk 選擇應新增到提交的內容。
git commit
Git 將把選定的變更提交到您目前的本地分支。
系統將提示您在編輯器中輸入日誌訊息,該編輯器在您的個人組態檔中透過以下方式設定
git config --global core.editor
或由以下環境變數之一設定:GIT_EDITOR、VISUAL 或 EDITOR。
2.10 編寫提交訊息
日誌訊息應簡潔但具有描述性。
第一行必須包含上下文、一個冒號以及提交內容的非常簡短的摘要。如有必要,可以新增詳細資訊,並以空行分隔。這些詳細資訊每行不應超過 60-72 個字元,除非包含程式碼。
良好提交訊息的範例
avcodec/cbs: add a helper to read extradata within packet side data Using ff_cbs_read() on the raw buffer will not parse it as extradata, resulting in parsing errors for example when handling ISOBMFF avcC. This helper works around that.
ptr might be NULL
如果第一行的摘要不足,請在訊息正文中解釋您進行變更的原因,您所做的事情從變更本身來看通常是顯而易見的。只說「錯誤修復」或「10l」是不好的。請記住,不同技能水平的人們會查看您的程式碼並在閱讀時自我學習。請勿在日誌訊息中包含檔案名稱,除非在上下文中,Git 會提供該資訊。
如果提交修復了已註冊的問題,請在正文的單獨一行中說明:Fix Trac ticket #42.
第一行將用於透過 git format-patch
命名補丁。
在 git log --oneline
中看到的常見第一行錯誤包括:開頭缺少上下文;描述補丁之前程式碼的功能;行太長或換行到第二行。
2.11 準備補丁集
git format-patch <commit> [-o directory]
將為 <commit> 和目前 <HEAD> 之間的每次提交產生一組補丁。例如
git format-patch origin/master
將為目前分支上不存在於 upstream 中的所有提交產生補丁。一個有用的快捷方式也是
git format-patch -n
它將從最近的 n 次提交產生補丁。預設情況下,補丁會在目前目錄中建立。
2.12 發送補丁以供審閱
git send-email <commit list|directory>
將發送由 git format-patch
建立的補丁,或直接產生它們。所有電子郵件欄位都可以在全域/本地組態中設定,或透過命令列覆寫。請注意,此工具通常必須單獨安裝(例如 Debian based 發行版上的 git-email 套件)。
2.13 重新命名/移動/複製檔案或檔案內容
Git 會自動追蹤此類變更,使這些變更成為正常的提交。
mv/cp path/file otherpath/otherfile git add [-A] . git commit
3 Git 設定
為了簡化一些工作流程,建議同時設定您的個人 Git 安裝和本地 FFmpeg 儲存庫。
3.1 個人 Git 安裝
將以下內容新增到您的 ~/.gitconfig,以幫助 git send-email
和 git format-patch
偵測重新命名
[diff] renames = copy
3.2 儲存庫設定
為了讓 git send-email
自動將補丁發送到 ffmpeg-devel 郵件列表,請將以下節點新增到 /path/to/ffmpeg/repository/.git/config
[sendemail] to = ffmpeg-devel@ffmpeg.org
4 FFmpeg 特定
4.1 還原損壞的提交
git reset <commit>
git reset
將取消提交變更,直到 <commit>,並重寫目前分支歷史記錄。
git commit --amend
允許快速修改上次提交的詳細資訊。
git rebase -i origin/master
將在主儲存庫上重新套用本地提交,從而在過程中編輯、合併或移除其中一些提交。
git reset
、git commit --amend
和 git rebase
會重寫歷史記錄,因此您應該僅在您的本地或主題分支上使用它們。主儲存庫將拒絕這些變更。
git revert <commit>
git revert
將產生一個還原提交。這不會使錯誤的提交從歷史記錄中消失。
4.2 將變更推送到遠端樹
git push origin master --dry-run
將模擬將本地 master 分支推送到預設遠端 (origin)。並列出哪些分支和範圍或提交將被推送。如果本地和遠端樹不同步,Git 將阻止您推送變更。請參閱 將原始碼樹更新到最新版本。
git remote add <name> <url>
將新增具有名稱參考的其他遠端,如果您想在遠端主機上推送您的本地分支以供審閱,這非常有用。
git push <remote> <refspec>
將變更推送到 <remote> 儲存庫。省略 <refspec> 會使 git push
更新所有與本地分支匹配的遠端分支。
4.3 尋找特定的 svn 版本
自 1.7.1 版起,Git 支援 ':/foo' 語法,用於根據正規表示式指定提交。請參閱 man gitrevisions
git show :/'as revision 23456'
將顯示 svn 變更集 'r23456'。對於較舊的 Git 版本,在 git log
輸出中搜尋是最簡單的選項(尤其是在使用具有搜尋功能的 pager 時)。
可以使用以下命令 checkout 此提交
git checkout -b svn_23456 :/'as revision 23456'
或對於 Git < 1.7.1,使用
git checkout -b svn_23456 $SHA1
其中 $SHA1 是來自 git log
輸出的提交雜湊值。
5 gpg 金鑰產生
如果您還沒有 gpg 金鑰,我們建議您建立一個基於 ed25519 的金鑰,因為它體積小、速度快且安全。尤其是在 git 中產生小的簽名。
gpg --default-new-key-algo "ed25519/cert,sign+cv25519/encr" --quick-generate-key "human@server.com"
產生金鑰時,請確保指定的電子郵件與 git 中使用的電子郵件相符,因為某些網站(例如 github)會認為不匹配是宣告此類提交未驗證的原因。產生金鑰後,您可以將其新增到 MAINTAINER 檔案並將其上傳到金鑰伺服器。
6 推送前檢查清單
一旦您擁有一組您認為已準備好推送的提交,請完成以下檢查清單,以仔細檢查一切是否井然有序。此清單力求詳盡。如果您只是推送註解中的錯字,則某些步驟可能是不必要的。應用您的常識,但如有疑問,請謹慎行事。
首先,請確保您要推送的提交和分支與您想要推送的內容相符,並且沒有遺漏、多餘或錯誤的內容。您可以先執行帶有 --dry-run 的 git push 命令,然後檢查使用 git log -p 1234567..987654
列出的提交,以查看將要推送的內容。git status
命令可能有助於找到忘記新增的本地變更。
接下來,讓程式碼通過我們測試套件的完整執行。
-
make distclean
-
/path/to/ffmpeg/configure
-
make fate
- 如果 fate 因缺少樣本而失敗,請執行
make fate-rsync
並重試
請確保您的所有變更在推送之前都已檢查,測試套件僅針對回歸進行檢查,且僅在一定程度上。它顯然不會檢查新新增的功能/程式碼是否正常運作,除非您已為其新增測試(建議這樣做)。
另請注意,每個提交都應通過測試套件,而不僅僅是一系列補丁的結果。
一切通過後,將變更推送到您的公開 ffmpeg 克隆,並向 ffmpeg-devel 發布合併請求。您也可以直接推送它們,但不建議這樣做。
7 伺服器問題
如果您對 Git 伺服器有技術問題,請聯絡專案管理員:root@ffmpeg.org。
本文檔於 2025 年 1 月 21 日 使用 makeinfo 生成。
託管由 telepoint.bg 提供