Git之深入解析在没有合适的网络或者可共享仓库情况下的git bundle打包操作
生活随笔
收集整理的這篇文章主要介紹了
Git之深入解析在没有合适的网络或者可共享仓库情况下的git bundle打包操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 了解了管理或者維護 Git 倉庫、實現代碼控制所需的大多數日常命令和工作流程,嘗試跟了蹤和提交文件的基本操作,并且掌握了暫存區和輕量級地分支及合并的威力。如果想進一步對 Git 深入學習,可以學習一些 Git 更加強大的功能,這些功能可能并不會在日常操作中使用,但在某些時候可能還是會起到一定的關鍵性作用。
- 如果還不清楚 Git 的基礎使用流程、分支的管理、托管服務器的技術以及分布式工作流程等相關的技術和能力,請參考博客:
-
- Git之深入解析Git的安裝流程與初次運行Git前的環境配置;
-
- Git之深入解析本地倉庫的基本操作·倉庫的獲取更新和提交歷史的查看撤銷以及標簽別名的使用;
-
- Git之深入解析Git的殺手級特性·分支管理與變基的開發工作流以及遠程分支的跟蹤;
-
- Git之深入解析如何運行自己的Git倉庫托管服務器;
-
- Git之深入解析如何使用Git的分布式工作流程與如何管理多人開發貢獻的項目。
- 雖然已經了解了網絡傳輸 Git 數據的常用方法(如 HTTP,SSH 等),但還有另外一種不太常見卻又十分有用的方式,Git 可以將它的數據“打包”到一個文件中。
- 這在許多場景中都很有用,有可能網絡中斷了,但又希望將我們的提交傳給合作者們,我們可能不在辦公網中并且出于安全考慮沒有接入內網的權限,可能無線、有線網卡壞掉了,可能現在沒有共享服務器的權限,然而我們又希望通過郵件將更新發送給別人,卻不希望通過 format-patch 的方式傳輸 40 個提交。這些情況下 git bundle 就會很有用,bundle 命令會將 git push 命令所傳輸的所有內容打包成一個二進制文件,可以將這個文件通過郵件或者閃存傳給其他人,然后解包到其他的倉庫中。
- 來看看一個簡單的例子,假設有一個包含兩個提交的倉庫:
- 如果想把這個倉庫發送給其他人但沒有其他倉庫的權限,或者就是懶得新建一個倉庫,就可以用 git bundle create 命令來打包:
- 然后就會有一個名為 repo.bundle 的文件,該文件包含了所有重建該倉庫 master 分支所需的數據。在使用 bundle 命令時,需要列出所有希望打包的引用或者提交的區間,如果希望這個倉庫可以在別處被克隆,應該像例子中那樣增加一個 HEAD 引用。我們可以將這個 repo.bundle 文件通過郵件或者U盤傳給別人。
- 另一方面,假設別人傳給我們一個 repo.bundle 文件并希望在這個項目上工作,可以從這個二進制文件中克隆出一個目錄,就像從一個 URL 克隆一樣:
- 如果在打包時沒有包含 HEAD 引用,還需要在命令后指定一個 -b master 或者其他被引入的分支,否則 Git 不知道應該檢出哪一個分支。
- 現在假設提交了 3 個修訂,并且要用郵件或者U盤將新的提交放在一個包里傳回去:
- 首先我們需要確認我們希望被打包的提交區間,和網絡協議不太一樣,網絡協議會自動計算出所需傳輸的最小數據集,而我們需要手動計算。當然可以像上面那樣將整個倉庫打包,但最好僅僅打包變更的部分,就是我們剛剛在本地做的 3 個提交。
- 為了實現這個目標,我們需要計算出差別,有很多種方式去指明一個提交區間,我們可以使用 “origin/master…master”或者“master ^origin/master”之類的方法來獲取那 3 個在 master 分支而不在原始倉庫中的提交。可以用 log 命令來測試:
- 這樣就獲取到我們希望被打包的提交列表,讓我們將這些提交打包,可以用 git bundle create 命令,加上想用的文件名,以及要打包的提交區間:
- 現在在目錄下會有一個 commits.bundle 文件,如果把這個文件發送給我們的合作者,她可以將這個文件導入到原始的倉庫中, 即使在這期間已經有其他的工作提交到這個倉庫中。
- 當她拿到這個包時,她可以在導入到倉庫之前查看這個包里包含了什么內容,bundle verify 命令可以檢查這個文件是否是一個合法的 Git 包,是否擁有共同的祖先來導入:
- 如果打包工具僅僅把最后兩個提交打包,而不是三個,原始的倉庫是無法導入這個包的, 因為這個包缺失了必要的提交記錄。這時候 verify 的輸出類似:
- 而我們的第一個包是合法的,所以可以從這個包里提取出提交。如果想查看這邊包里可以導入哪些分支,同樣有一個命令可以列出這些頂端:
- verify 子命令同樣可以知道哪些頂端,該功能的目的是查看哪些是可以被拉入的,所以可以使用 fetch 或者 pull 命令從包中導入提交。這里我們要從包中取出 master 分支到我們倉庫中的 other-master 分支:
- 可以看到已經將提交導入到 other-master 分支,以及在這期間我們自己在 master 分支上的提交:
- 因此,當在沒有合適的網絡或者可共享倉庫的情況下,git bundle 很適合用于共享或者網絡類型的操作。
總結
以上是生活随笔為你收集整理的Git之深入解析在没有合适的网络或者可共享仓库情况下的git bundle打包操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git之深入解析如何使用Git调试项目源
- 下一篇: Git之深入解析凭证存储