git 儲存庫可以在作業系統和檔案系統之間移植嗎

git 儲存庫可以在作業系統和檔案系統之間移植嗎

……特別是透過 FAT32 或 exFAT USB 隨身碟移動時?

即使工作副本可能會遭受權限更改,並且明顯刪除符號連結(如果使用它們)......這些更改是 Git 能夠很好地檢測到的,除此之外,目錄.git/內容是否足以允許將儲存庫從一個作業系統和/或檔案系統移動到另一個作業系統和/或檔案系統?例如 Windows、常見 Linux 發行版、macOS、NTFS、ext FS、APFS

如有必要,我可以假設 Git 版本為 2+。

答案1

是的,儲存庫資料庫是通常可移植到所有現代作業系統,包括視窗。它不依賴任何擴展屬性,到目前為止也不依賴區分大小寫。資料庫內的檔案名稱似乎最多 52 個字元。

主要要求是檔名儲存他們的情況,即使在不區分大小寫的檔案系統上(例如,如果您將.git/HEAD 從ext4 複製到FAT32 到APFS 到HFS+ 到ext4,它應該保留.git/HEAD 而不是.git/head) 。幸運的是上面列出的所有檔案系統保留大小寫所以沒問題。

要記住的一件事是每個分支或標籤都表示為 .git/refs 下的單獨檔案。 Git 施加了嚴格的字元集限制,以便與任何檔案系統一起工作,但這並不總是足夠的- 如果您要遷移到不區分大小寫的檔案系統(例如APFS 或NTFS),最好希望儲存庫不包含多個分支或標籤僅大小寫不同。同樣,Git 並不禁止使用舊版 DOS 裝置名稱,例如auxnul作為分支/標籤名稱。


(從技術上講,跨不同檔案系統移動儲存庫可能會丟失一些檔案元數據,例如物件 blob 的「唯讀」( a-w) 狀態,但這不是 Git 本身關注的內容。)


如果您僅使用 FAT32 作為臨時傳輸,請考慮使用git pack-refs --all --prunerm -rf .git/logs避免任何分支名稱問題,儘管這種問題不太可能發生。也可以運行 agit repack -d; git prune以減少鬆散目標檔案的數量。

您甚至可以用來git bundle建立包含全部或部分提交歷史記錄的傳輸友善的 blob。

答案2

雖然複製.git目錄在大多數情況下都有效,但有一些注意事項需要注意:

  • git-svn 可能會記住一些您不想複製的使用者訊息,例如姓名和電子郵件地址,例如在.git/logs/refs/remotes/trunk.

  • 克隆的存儲庫將包含返回父級的鏈接,複製命令不會取消創建該鏈接。您可以使用 刪除該連結git remote remove origin

  • 如果目錄中有符號鏈接.git,您需要確保取消引用它們。例如:

    cp -r -L <source-repo-dir> <destination-repo-dir>
    
  • 某些配置項目可能因平台而異,例如自訂差異驅動程式和引用外部程式的掛鉤腳本。在不同平台之間進行複製時,應該驗證諸如core.ignorecasecore.autocrlf以及 其他一些項目。core.safecrlfcore.fileMode

  • 複製 是可以在計算機之間操作的安全操作:

    git clone ssh://[email protected]/path/to/my-project.git
    

    克隆會自動建立一個名為「origin」的遠端連接,指向原始儲存庫,從而可以輕鬆地與中央儲存庫進行互動。

您可能會對閱讀以下有關選擇性移動 git 目錄的教學感興趣:

如何移動完整的 Git 儲存庫

相關內容