X

Git 透過 Email 傳送 Patch / Commit

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

  1. $ git clone http://example.com/project.git # remote git clone, 隨便修改幾個檔案, 並 commit.
  2. $ git fetch origin # 更新 origin 分支, 防止 origin 分支不是最新的 Repository, 而產生錯誤的 patch.
  3. $ git rebase origin # 將你在 master 上 commit 的工作更改到最新 Repository 的狀態基礎上
  4. $ git format-patch origin # 產生 patch. ex: 0001-your-commit.txt

# 切到 B

  1. $ git am 0001-your-buddy-s-contribution.txt # 將 patch 補上

實作測試

A:

  1. $ vim master.txt
    test
  2. $ git commit -m 'add test' -a
  3. $ git fetch origin
  4. $ git rebase origin
  5. $ git format-patch origin # 產生 0001-add-test.patch
  6. # 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:

  1. # Rec mail, get /tmp/0001-add-test.patch
  2. $ cd project_name
  3. $ git am /tmp/0001-add-test.patch # 或 git apply /tmp/0001-add-test.patch (單一 patch 可用 apply, am 可直接給 mbox)
  4. $ git add .
  5. $ git commit -m 'add patch'

相關範例1: Git diff 產生 patch 並傳送

  1. $ git diff master^ > change.diff
  2. $ patch -p1 < change.diff 或 git apply change.diff

相關範例2: Git patch 產生 與 匯入

  1. $ git format-patch origin/master --stdout > story.patch
  2. $ git am < store.patch

相關範例3: Git patches 產生、寄出、匯入

  1. # format-patch -o (-o 會把 patches 都放到指定目錄下)
  2. $ git format-patch -o patches origin # 會產生 patches 的目錄, 所有 patch 都會在此目錄下.
  3. $ git send-email --to xxx@email.com patches # 將此目錄下的檔案都寄出
  4. $ git am mbox # 匯入.

相關網頁

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post