Git 可以透過各種格式, Email 也是一種, 可以很快速的產生某區間的所有 patch(依照 commit log), 再將這些 patch 一起傳給其它人.
Git 指令
- git-apply - Apply a patch on a git index file and a working tree
- git-am - Apply a series of patches from a mailbox
- git-mailinfo - Extracts patch and authorship from a single e-mail message
- git-send-email - Send a collection of patches as emails
注意事項
- origin(remote) 是 Repository 的版本
- master(branch) 是 local 端, 正在修改的版本
- git clone http://example.com/project.git # 會產生 project 目錄
- vim project/.git/config # 由 config 可知, 預設有兩個分支: master(branch) / origin(remote)
- 再來就都於 master 開始工作, 也可以產生 branch, 但是不要去修改到 origin 的分支.
- 因為 origin 是 Repository 的 mirror, 如果修改的話, 就不能對 Repository 產生 patch 了.
- 如果已經修改過 origin 分支的話, 在生成 patch 檔之前, 可用 git reset --hard 讓他回到最原始沒修改過的狀態.
步驟
# 透過 Email 做 patch, A / B 為 不同使用者.
# A
- $ git clone http://example.com/project.git # remote git clone, 隨便修改幾個檔案, 並 commit.
- $ git fetch origin # 更新 origin 分支, 防止 origin 分支不是最新的 Repository, 而產生錯誤的 patch.
- $ git rebase origin # 將你在 master 上 commit 的工作更改到最新 Repository 的狀態基礎上
- $ git format-patch origin # 產生 patch. ex: 0001-your-commit.txt
# 切到 B
- $ git am 0001-your-buddy-s-contribution.txt # 將 patch 補上
實作測試
A:
- $ vim master.txt
test - $ git commit -m 'add test' -a
- $ git fetch origin
- $ git rebase origin
- $ git format-patch origin # 產生 0001-add-test.patch
- # sendmail 0001-add-test.patch to B 或 git send-email --suppress-from --to B@email.com 0001-add-test.patch
註: 若是 branch 和 master 比較來產生 patch:
1. git format-patch -C master..branch_name
2. git send-email --compose --no-chain-reply-to --suppress-from --to B@email.com 00*.patch
B:
- # Rec mail, get /tmp/0001-add-test.patch
- $ cd project_name
- $ git am /tmp/0001-add-test.patch # 或 git apply /tmp/0001-add-test.patch (單一 patch 可用 apply, am 可直接給 mbox)
- $ git add .
- $ git commit -m 'add patch'
相關範例1: Git diff 產生 patch 並傳送
- $ git diff master^ > change.diff
- $ patch -p1 < change.diff 或 git apply change.diff
相關範例2: Git patch 產生 與 匯入
- $ git format-patch origin/master --stdout > story.patch
- $ git am < store.patch
相關範例3: Git patches 產生、寄出、匯入
- # format-patch -o (-o 會把 patches 都放到指定目錄下)
- $ git format-patch -o patches origin # 會產生 patches 的目錄, 所有 patch 都會在此目錄下.
- $ git send-email --to xxx@email.com patches # 將此目錄下的檔案都寄出
- $ git am mbox # 匯入.