多台開發主機間要同步程式修改進度,最簡單的方法是將專案放上 Github、TFS/Azure DevOps Server、自架的 Gitea 私服,甚至用網路分享資料夾也成。在 A 主機 Commit 異動的程式 Push 到伺服器,B 主機一個 Pull 就能同步到最新版本,簡單又方便。

但如果是目標主機在隔離環境無法直接連網,只能透過 Email、SFTP 或 USB 行動碟輾轉取得檔案要怎麼將最新的 Commit 拉回 Repostory?

最近學到一個新技巧:git bundle

簡單說,git bundle 命令可將整個 Repository 或指定範圍的一個或多個 Commit 打包成專屬二進位檔(副檔名為 .bundle),要更新的一方,可使用 git clonegit pull 取得最新內容。

以下是列舉兩個最常見的應用情境:

情境一

將整個 Repository 的兩個 Branch (master + dev) 打包,在另一台主機還原

# 來源端
# 若只打包 master,給 master 即可,或是寫 HEAD 代表目前 Branch 及位置
git bundle create D:\repo.bundle master dev 

# 目的端
git clone D:\reop.bundle MyProject # 指令資料夾 

來源共兩個 Branch,4 個 Commit:

在目的主機原汁原味重現:

情境二

打包最近一次或多次的 Commit 傳過去同步。

# 來源端
# 只打包最近一次 Commit
git bundle create D:\latest.bundle HEAD~..HEAD
# 最近兩次
git bundle create D:\recent.bundle HEAD~2..HEAD

# 目的端
git pull D:\latest.bundle 

如此就可以只包最後的 Commit 送給對方同步。

但要注意差異式打包要涵蓋對方缺少的所有 Commit 才行,例如下面的例子,ComputerA 已經做到 Commit 6,而 ComputerB 只在 Commit 4,用 HEAD~..HEAD 只會打包 Commit 6,ComputerB pull 時會出現錯誤,抱怨缺少 Commit 5 8e87e0d...

改成打包 HEAD~2..HEAD 就 OK 囉~

Synchronizing code changes between development machines is easy with GitHub, TFS, or a self-hosted Gitea server. However, for isolated environments, git bundle is a powerful tool. It packages commits into a binary file, which can be transferred via email, SFTP, or USB. This post details how to create and use git bundles to sync repositories in different scenarios.


Comments

Be the first to post a comment

Post a comment